SICP 习题 2.7 开始属于扩展练习,可以考虑不做,对后面的学习没什么影响。不过,如果上面的使用过程表示序对,还有丘奇计数你都可以理解的话,完成这些扩展练习其实没什么问题。习题2.7是要求我们协助Allysa完成interval的定义。Allysa定义了下面的过程来创建一个区间(interval),其中a是起点(就是较小的部分),而b是终点(就是较大部分)。(define (make-inte...
分类:
其他好文 时间:
2014-10-08 01:49:24
阅读次数:
216
SICP 习题 2.6 讲的是丘奇计数,是习题2.4 和 2.5的延续。 这里大师们想提醒我们思考的是“数”到底是什么,在计算机系统里可以如何实现“数”,准备好开始脑洞大开吧:题目先讲到下面的定义,首先是0的定义:(define zero (lambda (f) (lambda (x) x)))
然后是操作+ 1的定义:(define (add-1 n)
(lambda (f) (lambda...
分类:
其他好文 时间:
2014-09-29 01:23:17
阅读次数:
267
SICP 习题 2.5 有点像是道数学题,首先要求我们证明可以将a和b的序对表示为2^a * 3^b,然后通过非负整数和算术运算表示序对。最后要求我们实现对应的cons, car 和cdr过程。这道题的根本就是复合数据的构成方式和解析方式。其实,对于所有复合数据来讲,我们都在处理同样一件事情,就是如何把复合数据的组成部分构建在一起,同时可以通过特定的方法将它们拆解出来。就好像我们要存放乒乓球和网球...
分类:
其他好文 时间:
2014-09-28 02:29:40
阅读次数:
176
SICP 习题 2.4 是一道很有意思的题目,它在一定程度上会改变你对数据结构的认识。按题目的说法,这里讲到的是“序对的过程性表示”。序对大家应该熟悉了,前面几道题都和序对有关系,那序对的“过程性表示”是什么意思呢?简单一点说就是用一种过程(或者说函数啦)来实现序对。在此之前,对于很多程序员来讲,数据是数据,过程是过程,两者是单独存在的,过程一般是用来访问数据的。像这里讲到的使用一个过程来实现数据...
分类:
其他好文 时间:
2014-09-26 04:05:58
阅读次数:
267
第1.1节的练习包括习题1.1到1.8
其中习题1.1--1.6在构造过程抽象的第一节已经给出。
下面给出练习1.7和练习1.8的题解。
练习1.7
首先观察课本上的程序的问题.
可以发现,对于特别小的数,比如 0.00009 ,书本给出的 sqrt 并不能计算出正确的答案; 而对于特别大的数,因为实现的小数精度不足以表示两个大数之间的差,所以 sqrt 会陷入死循环而无法得...
分类:
其他好文 时间:
2014-09-24 10:33:59
阅读次数:
230
SICP 习题 2.3 要求我们实现一种平面矩形的表示,定义获取数据的相关选择函数。然后定义几个过程来计算矩形的周长和面积。接着题目还要求我们实现矩形的另一种表示方式,要求这个新的矩形表示方式同样适用于以上定义的周长和面积计算过程。有关这道题我们可以通过由上而下的方式进行实现,实现过程也不算复杂,原因是这道题涉及到的数学概念还是比较简单,就是矩形的面积和周长,差不多是我们小学的知识吧。不过题目后面...
分类:
其他好文 时间:
2014-09-24 01:34:05
阅读次数:
292
SICP 习题 2.2要求我们使用这一节的数据抽象方法定义几何里“点”的概念,还要定义“线段”的概念,最后还要求我们定义midpoint-segment过程,这个过程根据参数中的线段进行计算,返回该线段的中点。题目还给出了一个print-point过程,用于输出一个点,代码如下:(define (print-piont p)
(newline)
(display "(")
(displ...
分类:
其他好文 时间:
2014-09-23 01:25:14
阅读次数:
288
SICP 习题 2.1 要求我们做一个可以正确处理正数和负数的make-rat过程,用于生成一个有理数。条件是分母必须是正数。完成这道题本身比较简单,就是简单修改一下书中的make-rat过程就可以了。书中原本的make-rat过程如下:(define (make-rat n d)
(cons n d))
可以发现,原来的make-rat就是简单地将n和d组成一个序对,然后返回这个序对,并没有对...
分类:
其他好文 时间:
2014-09-22 00:43:01
阅读次数:
269
SICP 习题 1.46 要求我们写一个过程iterative-improve,它以两个过程为参数,其中一个参数用来检测猜测是否足够好,另一个参数用来改进猜测。过程iterative-improve应该返回另一个过程,所返回的过程接收一个参数作为初始猜测,然后不断改进猜测直到结果足够好。题目还要求我们使用iterative-improve重写1.1.7的sqrt过程和1.3.3节的fixed-po...
分类:
其他好文 时间:
2014-09-21 00:46:49
阅读次数:
443
SICP 习题 1.45是对前面很多关于不动点的习题的总结。题目回顾了我们之前在1.3.3节使用的不动点寻找方法,当寻找y -> x/y 的不动点的时候,这个变换本身不收敛,需要做一次平均阻尼才可以。对于y -> x/(y^2)这个变换也可以通过一次平均阻尼使它变得收敛。不过一次平均阻尼对于四次方程是不够的,就是说,对y -> x/(y^3)这样的变换,一次平均阻尼不足以使它收敛,需要做两次平均阻...
分类:
其他好文 时间:
2014-09-18 23:48:34
阅读次数:
276