如何递归和迭代地计算方案中给定数字的数字?

时间:2012-10-04 21:02:44

标签: count numbers scheme digits recursive-datastructures

我知道如何计算数字的数字之和:

(define (sum-of-digits x)  
  (if (= x 0) 0
      (+ (modulo x 10) 
         (sum-of-digits (/ (- x (modulo x 10))
                           10)))))`

但我只是没有线索来计算数字。并且也不知道如何通过线性迭代进展来做到这一点。

谢谢!

2 个答案:

答案 0 :(得分:0)

非常接近答案。

为了弄清楚如何将位数更改为位数,请尝试编写一些测试用例。测试用例必须包含调用函数的示例,以及预期的结果。

作为旁注,这是生成递归的一个例子,你不应该解决它,直到你做了一堆问题,比如“在列表中添加数字”, “计算列表中的元素”等等。

答案 1 :(得分:0)

关于您的每个问题的一些提示:

  1. 对于计数位数,您无需添加当前数字(如代码中的情况)。只需添加1
  2. 即可
  3. 有几种策略可以将递归解决方案(如你的)转换为尾递归(一种产生线性迭代进度的递归)。这是一个简短的清单:

    • 向函数添加一个额外参数以保存到目前为止累积的结果
    • 在第一次调用过程时传递累加器的初始值,通常这与您在“正常”(非尾递归)递归中在基本情况下返回的值相同。
    • 在递归的基本情况下返回累加器
    • 在递归步骤中,使用新值更新累积结果并将其传递给递归调用
    • 最重要的是:当调用递归时,请务必将其称为最后一个表达式,而不执行“额外工作”。