List 在Scheme中将数字分成三组

List 在Scheme中将数字分成三组,list,scheme,List,Scheme,我试图创建一个函数,它接受一个数字并将其分成三组:(三组12345)->'(12345) 这是我一直在研究的代码: (define (group-of-three n) (cond ((< n 1000) n)) (cond ((> n 1000) (cons (group-of-three (quotient n 1000)) (remainder n 1000))))) (定义(三人一组) (秒(n 1000) (cons(三人组(商n1000))(

我试图创建一个函数,它接受一个数字并将其分成三组:(三组12345)->'(12345)

这是我一直在研究的代码:

(define (group-of-three n)
  (cond ((< n 1000) n))
  (cond ((> n 1000) 
         (cons (group-of-three (quotient n 1000)) (remainder n 1000)))))
(定义(三人一组)
(秒(n 1000)
(cons(三人组(商n1000))(余数n1000(щ)))
当我打电话给(三人组9999)时,我得到“(#.999)


如果有任何帮助,我将不胜感激。我对scheme非常陌生,因此我确信解决方案可能非常简单,我只是没有看到它。

您的代码有几个问题:

  • cond
    使用不正确,需要一个
    cond
    ,有两个相互排斥的条件。或者更简单,使用
    if
    表达式
  • 递归的基本情况是错误的,请记住:我们正在构建一个列表,因此结果必须以空列表结束
  • 为了以正确的顺序输出列表,输入的数字应该从右到左进行处理。如果我们使用带有额外参数的helper过程来累加结果,这将更容易做到——顺便说一句,这将产生一个尾部递归解决方案。或者,我们可以使用命名的
    let
这就是我的意思:

(define (group-of-three n)
  (helper n '()))

(define (helper n acc)
  (cond ((< n 1000) (cons n acc))
        (else (helper (quotient n 1000)
                      (cons (remainder n 1000) acc)))))

谢谢你的解释,我真的很感激!
(group-of-three 12345)
=> '(12 345)

(group-of-three 12345678)
=> '(12 345 678)