我不明白这两个变量是如何成比例的

时间:2019-08-05 02:12:01

标签: sicp

计算机程序的结构和解释第1.2.1节:线性递归和迭代:

  

比较这两个过程...每个过程都需要与n成正比的多个步骤才能计算n!

这两个进程由

指定
(define (factorial n)
  (if (= n 1)
      1
      (* n (factorial (- n 1)))))

;; This is the linear recursive process
(define (factorial n)
 (define (iter product counter)
   (if (> counter n)
       product
       (iter (* counter product)
             (+ counter 1))))
 (iter 1 1))

;; This is the linear iterative process

我的问题是:两个过程如何需要与n成正比的多个步骤才能计算n! ?

2 个答案:

答案 0 :(得分:0)

对于第一个过程; 您必须在一个递归循环中执行以下步骤:

- check if n equals 1
- multiply n with (factorial (- n 1))
  if we split it a little, it includes (- n 1) and a function call and a multiplication.

让我们将这些大致分为4个步骤。

由于必须执行这4步直到n = 1,所以总共是4 * n步。因此它与n成正比。 (让我们忽略一些细节,例如,对n = 1种情况的处理有些不同,因为当n足够大时,可以忽略它)

第二个是一样的

答案 1 :(得分:0)

在两种情况下,过程都将继续运行,直到满足特定条件为止。

  • 递归过程将继续调用(factorial)过程并减少n直到n=1
  • 迭代过程将不断增加counter变量,直到counter > n

n的值越大,满足每次终止检查的时间就越长。

示例(factorial 1000)(factorial 10)花费更长的时间,仅仅是因为将n每次减少factorial时需要花999步就减少data-namespace }(在递归过程中)被调用。另一方面,以10比1只需9步。

希望能回答您的问题。