【SICP练习】3 练习1.9-1.10

练习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次幂为……

时间: 2024-11-12 21:54:45

【SICP练习】3 练习1.9-1.10的相关文章

百度粉红色风科技上来看积分

http://www.ebay.com/cln/508gua_gvqjq/-/167266747010/2015.02.10 http://www.ebay.com/cln/jhu2290/-/167423283013/2015.02.10 http://www.ebay.com/cln/cha.m22/-/167166250017/2015.02.10 http://www.ebay.com/cln/fenyu56/-/167382503016/2015.02.10 http://www.eb

百度附件是分开就爱死了开发了

http://www.ebay.com/cln/m_m3154/-/167249028014/2015.02.10 http://www.ebay.com/cln/zhsu412/-/167238372018/2015.02.10 http://www.ebay.com/cln/mi.han5/-/167545028015/2015.02.10 http://www.ebay.com/cln/lij5252/-/167389481016/2015.02.10 http://www.ebay.co

SICP 习题 (2.10)解题总结: 区间除法中除于零的问题

SICP 习题 2.10 要求我们处理区间除法运算中除于零的问题. 题中讲到一个专业程序员Ben Bitdiddle看了Alyssa的工作后提出了除于零的问题,大家留意一下这个叫Ben的人,后面会不断出现这个人,只要是这个人提到的事情一般是对的,他的角色定位是个计算机牛人,不过是办公室经常能看到的那种牛人,后面还有更牛的. 对于区间运算的除于零的问题,处理起来也比较简单,只需要判断除数是不是为零,除数为零就报错.对于一个区间来讲,所谓为零就是这个区间横跨0,再直接一点讲就是起点是负数,终点是正数

SICP 1.10

> 解:这道题有前提条件:x==0 || y==0 || y==1 || (x>0 && y >1) (A 1 10)==1024 (A 2 4)==65536 (A 3 3)==65536 n>=0 (f n)=2*n (g n)=2的n次方 (h n)=h(n)=2的h(n-1)次方,其中h(1)=2,h(0)=0:或 解题技巧:阅读完整个题目,可以肯定是有规律可循的.采用顺推的方式,如先求(A 1 1),再(A 1 2) (A 1 3) .... SICP 1

【SICP练习】6 练习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

【SICP练习】10 练习1.16

 练习1.16 这道题题目特别长,说的无非就是要用一个不变量记录中间结果,然后写出对数步数内的通过迭代来计算幂的函数,当然了还要用到题目中括号内的那个关系.下面就直接上代码了: (define(fast-expt b n) (fast-expt-iter 1 b n)) (define(fast-expt-iter a b n) (cond ((= n 0) a) ((even? n) (fast-expt-iter a (square b) (/ n 2))) ((odd? n) (fas

【SICP练习】10 练习1.34

练习1.34 这道题我一开始不用Edwin的时候觉得是会陷入无限循环之中.后来在Edwin上试了一下才发现会报错,输出如下: (f f) ;The object 2 is not applicable. ;To continue, call RESTART with an option number: ;  (RESTART 2) => Specify a procedure to use in its place. ;  (RESTART 1) => Return to read-eval-

Racket 模拟SICP的流(延时计算)

默认的Racket是要对函数参数进行求值的, 例如(f 1 (+ 1 2))里面,(+ 1 2)要先求值为3,变为(f 1 3)再进行下一步操作.因此, Racket若按照SICP使用define关键字来定义延时计算的关键函数delay和cons-stream是不可行的, 需要用宏来定义,绕过求值. #lang racket (define (memo-proc proc) (let ((already-run? #f) (result #f)) (lambda () (if already-r

sicp 习题(1)

*/--> sicp 习题(1) Table of Contents 1. 1.1 求值 2. 1.2 前缀形式转换 3. 1.3 求较大的两个数之和 4. 1.4 描述行为 5. 1.5 applicative order vs normal order 1 1.1 求值 2 1.2 前缀形式转换 (/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5))))) 3 (- 6 2) (- 2 7)) 我的做法是从内到外开始写的 3 1.3 求较大的两个数之和 (define (f x