Racket中数字的数字是随机顺序

时间:2015-04-18 15:30:09

标签: recursion racket digit

我决定编写一个函数,给定一个数字将返回一个包含该数字中数字的列表,我的尝试是:

(define (rev-digits n)
  (if (= n 0)
    '()
    (cons (modulo n 10) (digits (quotient n 10)))))

(define (digits n)
  (reverse (rev-digits n)))

事实是,我需要数字的顺序正确,但函数会返回,例如:

> (digits 1234567890)
'(9 7 5 3 1 2 4 6 8 0)

看似随意的顺序......你能帮助我获得一个更加宽松的输出吗?

3 个答案:

答案 0 :(得分:1)

rev-digits需要自称,而不是digits

(define (rev-digits n)
  (if (= n 0)
    '()
    (cons (modulo n 10) (rev-digits (quotient n 10)))))

(define (digits n)
  (reverse (rev-digits n)))

应该有用。

值得注意的是,你的“随机”输出实际上并不是随机的;相反,数字从列表的开头到结尾来回“反弹”。这是有道理的,因为你有效地在数字函数的“正常”和反向版本之间来回切换。

答案 1 :(得分:1)

@JayKominek给出的答案是正确的,并修复了代码中的错误。为了补充它,这是一个替代实现:

(define (rev-digits n)
  (let loop ((n n) (acc '()))
    (if (< n 10)
        (cons n acc)
        (loop (quotient n 10) (cons (modulo n 10) acc)))))

上述代码的优点是:

  • 它的尾部递归,因此效率更高
  • n为零(您的代码返回空列表)时,它正确处理边缘情况
  • 由于使用了名为let
  • ,它不需要帮助程序
  • 以正确的顺序构建列表,最后不需要reverse

答案 2 :(得分:1)

一个简单的解决方案:

#lang racket
(define (digits n)
  (for/list ([c (number->string n)])
    (- (char->integer c) (char->integer #\0))))