习题答案已经搬到github中
看这书相当费时间,习题慢慢做,边做边发吧。
练习1.1
10 12 8 3 6 19 false 4 20
练习1.2 将下面的表达式转换为前缀形式
(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5))))) (* 3 (- 6 2) (- 2 7)))
练习1.3 定义一个过程,它以3个数为参数,返回其中较大的两个数之和
(define (largerSum a b c)
(cond ((and (> a c) (> b c)) (+ a b))
((and (> a b) (> c b)) (+ a c))
(else (+ b c))
)
)
练习1.4 描述下面的过程的行为
(define (a-plus-abs-b a b)
((if (> b 0) + -) a b)
)
若b大于0,返回(a+b),否则返回(a-b)
练习1.5 下面的过程在正则序和应用序下有何不同
(define (p) (p))
(define (test x y)
(if (= x 0)
0
y
)
)
(test 0 (p))
在正则序下,上面的过程会返回0,则应用序下会陷入无限循环
练习1.6
这个自定义的过程在正则序和应用序下有不同的行为,在应用序下会陷入无限循环
练习1.7 给计算平方根的过程加上一个精度控制
(define (countSqrt x precision)
(sqrt-loop x (nextGuess x 1.0) 1.0 precision)
)
(define (sqrt-loop original guess lastGuess precision)
(if (goodEnough guess lastGuess precision)
guess
(sqrt-loop original (nextGuess original guess) guess precision)
)
)
(define (goodEnough guess lastGuess precision)
(< (/ (abs (- guess lastGuess)) lastGuess) precision)
)
(define (nextGuess original y)
(/ (+ original y) 2)
)
练习1.8 求立方根的牛顿法基于如下事实,如果y是x的立方根的一个近似值,那么下式将给出一个更好的近似值:
(define (countCubeRoot x precision)
(countCubeRootLoop x (nextGuess x 1.0) 1.0 precision)
)
(define (countCubeRootLoop original guess lastGuess precision)
(if (goodEnough guess lastGuess precision)
guess
(countCubeRootLoop original (nextGuess original guess) guess precision)
)
)
(define (sqr y)
(* y y)
)
(define (goodEnough guess lastGuess precision)
(< (/ (abs (- guess lastGuess)) lastGuess) precision)
)
(define (nextGuess original y)
(/ (+ (/ original (sqr y)) (* 2 y)) 3)
)
练习1.9 下面几个过程各定义了一种加起两个正整数的方法,它们都是基于过程inc(将参数加1)和dec(将参数减1).
(define (+ a b)
(if (= a 0)
b
(inc (+ (dec a) b))
)
)
(define (+ a b)
(if (= a 0)
b
(+ (dec a) (inc b))
)
)
用代换模型展示这两个过程在求职(+ 4 5)时所产生的计算过程。
(define (+ a b)
(if (= a 0)
b
(inc (+ (dec a) b))
)
)
(+ 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
递归计算过程
(define (+ a b)
(if (= a 0)
b
(+ (dec a) (inc b))
)
)
(+ 3 6)
(+ 2 7)
(+ 1 8)
(+ 0 9)
9
迭代计算过程
练习1.10 下面过程计算一个称为Ackermann函数的数学函数:
(define (A x y)
(cond ((= y 0) 0)
((= x 0) (* 2 y))
((= y 1) 2)
(else (A (- x 1) (A x (- y 1))))
)
)
下面的表达式的值是什么?
(A 1 10)
(A 2 4)
(A 3 3)
请考虑下面的过程,其中的A就是上面定义的过程:
(define (f n) (A 0 n))
(define (g n) (A 1 n))
(define (h n) (A 2 n))
(define (k n) (* 5 n n))
请给出过程f、g和h对给定整数值n所计算的函数的数学定义。例如,(k n)的计算是5(n^2)
(A 1 10) = 1024
(A 2 4) = 65536
(A 3 3) = 65536
(define (f n) (A 0 n))
(f n)
(A 0 n)
2n
(define (g n) (A 1 n))
(A (- 1 1) (A 1 (- n 1)))
(A 0 (A 1 n-1))
(A 0 (A 0 (A 1 n-2)))
(A 0 (A 0 (A 0 ... (A 1 1))))
(A 0 (A 0 (A 0 .. 2)))
2^n
(define (h n) (A 2 n))
(A (- 2 1) (A 2 n-1))
(A 1 (A 2 n-1))
(A (- 1 1) (A 2 (A 2 n-1)))
(A 0 (A 2 (A 2 n-1)))
(* 2 (A 2 (A 2 n-1)))
2^(2^(2^ (...2))) (2的个数等于n)
练习1.11 函数f由如下的规则定义:如果n<3,那么f(n)=n;如果n>=3,那么f(n)=f(n-1)+2f(n-2)+3f(n-3)。请写一个采用递归计算过程计算f的过程,再写一个采用迭代计算过程计算f的过程。
递归计算过程
(define (f111 n)
(if (< n 3)
n
(+
(f111 (- n 1))
(* 2 (f111 (- n 2)))
(* 3 (f111 (- n 3)))
)
)
)
迭代计算过程
(define (g n)
(define (g-iter a b c count)
(if (> count n)
a
(g-iter (+ a
(* 2 b)
(* 3 c))
a
b
(+ count 1))))
(if (< n 3)
n
(g-iter 2 1 0 3)))
练习 1.12 帕斯卡三角形边界上的数都是1,内部的每个数是位于它上面的两个数之和。请写一个过程,采用递归计算过程计算出帕斯卡三角形
(define (pascal-triangle row col)
(if (or
(= col 1)
(= col row)
)
1
(+
(pascal-triangle (- row 1) (- col 1) )
(pascal-triangle (- row 1) col)
)
)
)
练习1.13 证明Fib(n)是最接近于n/5的整数,其中 = (1 + 5)/2。提示,令 = (1 - 5)/2,使用归纳法和斐波纳契数列的定义证明Fib(n) = (n - n)/5。
如提示所说,先证明Fib(n) = (n - n)/5。
具体的证明方法略(并不难)。
然后,为了了证明Fib(n)是最接近于n/5的整数,则需要证明(n/5 = n5 - Fib(n)) < 0.5,此时原命题成立。
事实上,虽然当n=1时,n/5的值约等于0.618033988(好神奇,黄金分割比例),但此时,n5约等于1.11803398,与之最近的整数是1,等于Fib(1),命题成立。
当n>=2时,n/5<0.5,原命题仍然成立。
- 大小: 1.6 KB
- 大小: 756 Bytes
分享到:
相关推荐
西普 我的 SICP 练习。
NULL 博文链接:https://pengpeng.iteye.com/blog/1344689
SICP习题解答,主要第一章的内容习题答案
SICP 习题答案 计算机程序的构造和解释 1-3章 习题答案
sicp-clojure 在 Clojure 中解决的 SICP 练习
sicp 我对SICP练习的回答
SICP-解决方案我对 SICP 练习的回答
SICP 在 Scheme 中制定的 SICP 练习
sicp
SICP_章_1-3 我对SICP第二版第1-3章的解决方案: 书中练习来自示例分配/ psets 项目位于 最后,来自考试
SICP书中练习的解决方案。 使用mit-scheme编译器9.2。
sicp in python 中文版 sicp in python 中文版 sicp in python 中文版 !!!download>>>https://github.com/wizardforcel/sicp-py-zh
SICP - 笔记和练习我把它放在这里是因为有一天它可能会帮助某人。 练习是ex*文件。 章节中的注释和代码是ch文件。安装下载 Racket.app。 使用 DrRacket.app 或像这样启动 Racket repl: /Applications/Racket\ v...
SICP.part1.rar SICP.part1.rar SICP.part1.rar
SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版
用法只需添加: :plugins [[lein-gen "0.2.1"]]到您的项目文件和生成器部分: :generators [[sicp-generators "0.1.0"]]然后使用以下内容创建测试/段落版本或测试/练习版本: lein generate exercise 1-1lein ...
SICP-Python版本
MySICP解决方案 我试图在这个寒假里学习旱灾,这是我对课本习题的解答... 这些答案不一定正确,我可能无法解决所有练习。 但是您可以参考提供的标准解决方案我正在使用中文版的sicp。 教科书中有一些错误, 可以在找到