【问题标题】:Combining a list of spaced numbers in Scheme在 Scheme 中组合一个间隔数字列表
【发布时间】:2012-10-09 04:27:56
【问题描述】:

我有一个函数,它接受一个诸如 36 之类的数字,并将其反转为

 '(6 3)

有没有办法把 6 3 组合成一个数?

这是我写的代码。

(定义(数字-> rdigits 数字) (如果 (rdigits (/ (- num (mod num 10)) 10))))) (定义可逆? (λ (n) (条件 [(空?n)#f] [else (odd? (+ n (list (number->rdigits n))))])))

谢谢!

【问题讨论】:

    标签: scheme


    【解决方案1】:

    您可以使用迭代函数来执行此操作,该函数依次获取列表中的每个元素,并累积一个结果。例如:

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

    【讨论】:

    • 有没有办法在不使用其他函数的情况下做到这一点?
    • 是的,一个函数也可以,但是效率会低一些。
    • 我想我现在并不是真正关心效率,我只是想了解它是如何工作的。
    • 在我看来,我上面给出的实现(带有内部函数)是最容易理解的。我建议使用示例列表进行几次迭代,看看它是如何工作的。如果您使用'(6 3 5 9),那么我已经在我的回答中列出了a 会发生什么。
    • 不过,我添加了一个单功能实现进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多