我决定编写一个函数,给定一个数字将返回一个包含该数字中数字的列表,我的尝试是:
(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)
看似随意的顺序......你能帮助我获得一个更加宽松的输出吗?
答案 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))))