码迷,mamicode.com
首页 > 其他好文 > 详细

【SICP练习】3 练习1.9-1.10

时间:2015-02-05 17:48:48      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

练习1.9

以下是第一个加起两个正整数的方法,其中inc将参数加1dec将参数减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

相信大家一看便知,计算的是n2倍。

同样的,过程g计算的是2n次方。

至于最后一个,当n等于01234时,结果依次为0241665536。计算n=5时,返回的只是超过了最大递归深度。但由此我们依旧可以得出结论。

20次幂为1

21次幂为2

22次幂为4

24次幂为16

216次幂为65536

265536次幂为……

【SICP练习】3 练习1.9-1.10

标签:

原文地址:http://www.cnblogs.com/NoMasp/p/4275370.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!