1.2过程与它们所产生的计算
1.2.1线性的递归和迭代
1.线性递归
求n!的值:
(define (factorial n)
(if (= n 1)
1
(* n (factorial (- n 1)))))
(factorial 6)
计算过程:
从这个计算过程可以看出,是先增长后收缩。并且是随着给定数n的值的增加,增长就会越大。解释器所要维护的运算链条就会越长,占用的空间会变大也耗时。但好处是我们可以不费力的刻画出问题的计算过程。线性递归具有很强的层次性。
时间=0(n)),正比于n
空间=0(n) 正比于n
2.线性迭代
求n!的值:
(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)))
(factorial 6)
计算过程:
可以认为迭代把计算过程储存在了变量 product counter max-count。在计算的每一步只需要保证 product ,counter, max-count是当前值,就能正确运行。哪怕在某一步暂停做了其他的事,只要保证了储存过程的变量的当前值不变,仍然可以正确运行。计算时所需的计算步骤随着n线性增长。
时间=0(n)),正比于n
空间=0(1) 这个计算过程所消耗的空间是固定不变的,即与1成正比
3.递归过程
当我们说一个过程是递归的时候,是从语法的形式上说的。说明这个过程的定义中(直接或者间接的)引用了该过程本身。我们所说的线性递归和线性迭代说的是计算过程的进展方式。所以会有人说某一递归过程,产生出一个迭代的计算过程。
4.尾递归
从上面递归的迭代计算过程,我们使用递归的方式实现了循环。我们回想一下C语言和java等中的for循环,while循环,do…while循环。其实这些循环的内部定义使用的就是尾递归(在定义的尾部使用递归)。
1.2.2 树形递归
1.线性递归的设计优化
斐波那契额数定义:
如果n=0,f=0;如果n=1,f=1;否则 f=f(n-1)+f(n-2)
可以根据上面的算式定义直接写ÿ