在Scheme中组合间隔数列表

时间:2012-10-09 04:27:57

标签: scheme

我有一个带有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))))])))

谢谢!

1 个答案:

答案 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函数使用累加器alst中的其余数字来逐步构建最终结果:

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函数。此外,此实现不是正确的尾递归,因此它在执行期间构建多个堆栈帧,然后在它们达到其最大递归深度之后展开它们。