SICP递归过程与迭代过程:使用递归过程生成迭代过程

时间:2013-06-22 18:54:47

标签: recursion sicp iteration

在SICP中Section 1.2.1 作者在下面给出了这样一个代码示例,说明如何使用迭代过程来解决阶乘问题:

(define (factorial n)
  (fact-iter 1 1 n))
(define (fact-iter product counter max-count)
  (if (> counter max-count)
      product
      (fact-iter (* counter product)
                 (+ counter 1)
                 max-count)))

并且说“我们将一个递归过程称为事实 - 因为生成一个迭代过程可能看起来令人不安。但是,这个过程确实是迭代的:它的状态完全被它的三个状态变量和一个解释器捕获需要只跟踪三个变量才能执行该过程。“

我不明白作者的意思。递归过程和递归过程之间有什么区别?为什么他说下面的递归过程产生一个迭代过程?

1 个答案:

答案 0 :(得分:12)

递归进程需要在递归调用正在进行时维护调用者的状态。例如,如果你写了:

(define (fact-recurse n)
  (if (< n 2)
      1
      (* n (fact-recurse (- n 1)))))

外部调用必须记住n并等待内部调用返回,然后才能执行乘法。如果你调用(fact-recurse 10),当函数到达递归结束时,将有9个堆叠的乘法挂起。

但是在迭代过程中,可以丢弃先前的状态。这在示例代码中是可能的,因为所需的所有信息都作为递归调用中的参数传递。外部调用中的变量不再需要,因此不需要在堆栈中保留任何内容。

由于不再需要外部调用的参数,递归调用可以转换为赋值:

(set! product (* counter product))
(set! counter (+ counter 1)
(set! max-count max-count)

然后它跳转到程序的开头。