习题答案已经搬到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中,练习2.5通常涉及到了过程定义、抽象和组合,可能需要读者理解并实现一种计算机制,如迭代或递归。 2. **chapter2.ss**: 这可能是整个第二章所有练习题的集合或者部分题目的解答。通过这个文件,读者可以...
《SICP:我的SICP练习》是关于Scheme编程语言和计算机程序设计原理的一份学习资料。SICP,全称《结构与解释程序》(Structure and Interpretation of Computer Programs),是由Harvard大学的Hal Abelson和MIT的...
《计算机程序的构造和解释》(SICP)是一本极具影响力的计算机科学教材,由Harold Abelson和Gerald Jay Sussman所著,MIT出版社出版。这本书以其深入探讨编程概念、程序设计方法以及计算机系统的工作原理而闻名。1-3...
《SICP习题解答,主要第一章的内容习题答案》 SICP,全称《Structure and Interpretation of Computer Programs》(计算机程序的构造和解释),是计算机科学领域的一本经典教材,由MIT(麻省理工学院)的 Harold ...
《SICP:我对SICP练习的回答》 SICP,全称为《Structure and Interpretation of Computer Programs》,是一本由Harvard大学的Herman Tulleken和MIT的Gerald Jay Sussman、Guy L. Steele Jr.共同编著的经典计算机...
"sicp-solutions"是一个针对该书练习题的解答集,主要使用了Scheme语言,一个Lisp方言,而具体的实现环境是mit-scheme 9.2。 Scheme语言是Lisp家族的一员,以其简洁的语法和强大的函数式编程特性闻名。在"sicp-...
"sicp-clojure" 项目则是将 SICP 的练习用 Clojure 语言进行了实现,为学习者提供了从不同角度理解和应用 Lisp 风格编程的良好资源。 在这个项目中,你可以找到一系列 Clojure 代码,它们对应于 SICP 教程中的各个...
1. **函数式编程**:SICP的核心是函数式编程思想,强调使用纯函数(无副作用)和避免状态变化。函数式编程可以提高代码的可读性和可维护性,减少错误来源。 2. **递归**:递归是 Scheme 和函数式编程中的基本构造,...
《SICP解决方案:对SICP练习的回答》 该资源是关于《计算机程序的构造和解释》(Structure and Interpretation of Computer Programs,简称SICP)这本书的解答集,作者针对书中各章节的练习提供了详尽的解答,旨在...
《SICP:在 Scheme 中制定的 SICP 编程练习》是针对计算机科学教育领域的一本经典教材——《结构与解释程序》(Structure and Interpretation of Computer Programs,简称 SICP) 的实践部分。SICP 由 Harold Abelson ...
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中文第二版
### SICP——《计算机程序的结构与解释》 #### 一、概述 《计算机程序的结构与解释》(Structure and Interpretation of Computer Programs, 简称SICP)是一本由MIT电气工程与计算机科学系教授Harold Abelson和...
在这个压缩包中,你将找到作者对第二版书中第1至3章练习题的解决方案,以及与麻省理工学院6.001课程相关的项目和考试题目。以下是这些章节中的核心知识点和学习重点: 1. **基础概念与Lisp语言**: - **Lisp语法**...
《SICP 2.2.4 节:图形语言》是计算机科学经典教材《结构与解释程序》(Structure and Interpretation of Computer Programs)中的一个重要章节,它深入介绍了如何利用编程来创建图形,以及如何设计和理解复杂的计算...
《计算机程序的构造与解释》(Structure and Interpretation of Computer Programs,简称SICP)是一本备受推崇的经典计算机科学教材,由Harold Abelson和Gerald Jay Sussman撰写,并由MIT出版社出版。这本书以其深入...
用法只需添加: :plugins [[lein-gen "0.2.1"]]到您的项目文件和生成器部分: :generators [[sicp-generators "0.1.0"]]然后使用以下内容创建测试/段落版本或测试/练习版本: lein generate exercise 1-1lein ...