练习1.9
以下是第一个加起两个正整数的方法,其中inc将参数加1,dec将参数减1。
(define (+ a b)
(if (= a 0)
b
(inc (+ (dec a) b))))
用代换模型展示(+ 4 5)如下:
(+ 4 5)
(inc (+ 3 5))
(inc (inc (+ 2 5)))
(inc (inc (inc (+ 1 5))))
(inc (inc (inc (inc (+ 0 5)))))
(inc (inc (inc (inc 5))))
(inc (inc (inc 6)))
(inc (inc 7))
(inc 8)
9
如上所示,在代换模型展示中包含了伸展和收缩两个阶段,并且伸展阶段所需的额外存储量和计算所需的步数都正比于参数a。因此这是一个线性递归过程。
以下是另一个加起两个正整数的方法。
(define (+ a b)
(if (= a 0)
b
(+ (dec a) (inc b))))
同样用代换模型展示(+ 4 5)如下:
(+ 4 5)
(+ 3 6)
(+ 2 7)
(+ 1 8)
(+ 0 9)
9
在这个过程中并没有任何增长或者收缩,而其计算过程可用固定数目的状态变量(a)描述。这是一个线性迭代过程。
练习1.10
我们先将Ackermann函数写入Edwin中,当然了,再获取结果之前应该先自己用笔算算。结果如下:
(A 1 10)
;Value: 1024
(A 2 4)
;Value: 65536
(A 3 3)
;Value: 65536
其中65536也就是16的四次方。
接下来通过连续的n值来观察题目中随后给出的几个过程。和之前一样,直接代入题目中所给的函数即可。
(define (f n) (A 0 n)):
n 0 1 2 3 4 5 6 7 8 9
(f n) 0 2 4 6 8 10 12 14 16 18
相信大家一看便知,计算的是n的2倍。
同样的,过程g计算的是2的n次方。
至于最后一个,当n等于0,1,2,3,4时,结果依次为0,2,4,16,65536。计算n=5时,返回的只是超过了最大递归深度。但由此我们依旧可以得出结论。
2的0次幂为1,
2的1次幂为2,
2的2次幂为4,
2的4次幂为16,
2的16次幂为65536,
2的65536次幂为……