我有一个带有36之类数字的函数,并将其反转为
'(6 3)
无论如何要将6 3组合成一个数字吗?
这是我写的代码。
(define (number->rdigits num) (if (rdigits (/ (- num (mod num 10)) 10))))) (define reversible? (lambda (n) (cond [(null? n) #f] [else (odd? (+ n (list (number->rdigits n))))])))
谢谢!
答案 0 :(得分:0)
您可以使用迭代函数执行此操作,该函数依次获取列表中的每个元素,累积结果。例如:
(define (make-number lst)
(define (make a lst)
(if (null? lst)
a
(make (+ (* 10 a) (car lst)) (cdr lst))))
(make 0 lst))
(display (make-number '(6 3)))
make
函数使用累加器a
和lst
中的其余数字来逐步构建最终结果:
a = 0
a = 0*10 + 6 = 6
a = 6*10 + 3 = 63
如果您的列表中有更多数字,则会继续:
a = 63*10 + 5 = 635
a = 635*10 + 9 = 6359
使用单个函数的效率较低的实现可能如下:
(define (make-number lst)
(if (null? lst)
0
(+ (* (expt 10 (length (cdr lst))) (car lst)) (make-number (cdr lst)))))
此函数需要为每次迭代计算列表剩余部分的length
,并重复调用expt
函数。此外,此实现不是正确的尾递归,因此它在执行期间构建多个堆栈帧,然后在它们达到其最大递归深度之后展开它们。