SICP 习题 (2.12)解题总结 :区间的不同实现方式
来源:互联网 发布:花都电视台网络 编辑:程序博客网 时间:2024/06/15 19:36
SICP 习题 2.12 要求我们定义一个构造函数make-center-percent,它接收两个参数,分别代表中心点和一个误差百分比。我们需要通过这个构造函数产生一个区间。此外还需要定义一个选择函数percent,用来获取指定区间的误差百分比。还有就是需要实现一个center函数用于获取区间的中间点。
这里的关键就是要我们明白一个复合数据类型可能会有不同的表现形式,比如这里的区间可以用起点和终点表示,也可以使用中心点和误差表示。
从内部实现来讲,可以简单的将两种表现形式相关的数据都保存起来,比如我们同时记录区间的起点、终点、中心点和误差。但是这样我们就需要在数据更新时同时两种数据,比如我们获得了新的起点和终点数据,那我们就必须同时更新起点,终点,中心点和误差这些数据,而新的中心点和误差可以根据新的起点和终点计算出来。
既然都是需要转换,另一中实现思路就是只保留一种形式的数据,当获得另一种形式的数据时通过计算转换成第一种数据。
所以,在这里我们就依然采用之前的起点和终点的区间数据保存形式,当我们通过make-center-percent构建区间时就通过计算把中心点和误差百分比转换成起点和终点。
代码如下:
(define (make-center-percent center percent) (make-interval (- center (* center (/ percent 100))) (+ center (* center (/ percent 100)))))
这样,获取中心点的代码和书中就是一样的了,通过起点和终点相加再除于2可以得到:
(define (center i) (/ (+ (lower-bound i) (upper-bound i)) 2))
当我们知道一个区间的起点和终点,就可以通过计算宽度再得出误差偏移量,再把偏移量除于中心点就可以得出误差相对于中心点的百分比了。这里要注意的时书中对区间宽度的定义是起点到终点距离的一半,所以这里的区间宽度恰好是它的误差偏移量。计算误差百分比的代码如下:
(define (percent i) (* 100 (abs (/ (interval-width i) (center i)))))
这样就完成了习题2.12。
0 2
- SICP 习题 (2.12)解题总结 :区间的不同实现方式
- SICP 习题 (2.8) 解题总结:区间的减法
- SICP 习题 (2.11)解题总结:区间乘法的优化
- SICP 习题 (2.23)解题总结:for-each的实现
- SICP 习题 (2.9)解题总结:区间的宽度和区间加减乘除的关系
- SICP 习题 (2.7) 解题总结 : 定义区间数据结构
- SICP 习题 (2.13)解题总结:区间计算误差
- SICP 习题 (2.10)解题总结: 区间除法中除于零的问题
- SICP 习题 (2.14)解题总结:区间误差导致的问题
- SICP 习题 (2.15)解题总结:区间误差的深入思考
- SICP 习题 (2.16)解题总结:避免误差的区间计算系统
- SICP 习题 (1.46)解题总结:第一章的收官题
- SICP 习题 (2.17)解题总结:列表的遍历
- SICP 习题 (2.21)解题总结: map的使用
- SICP 习题 (2.24)解题总结:列表的结构
- SICP 习题 (2.25)解题总结:列表的操作
- SICP 习题 (2.27)解题总结:树状列表的遍历
- SICP 习题 (2.28)解题总结:树状列表的遍历
- SICP 习题 (2.10)解题总结: 区间除法中除于零的问题
- 数组模拟队列和栈
- Linux 驱动 Printk 在终端没有输出
- SICP 习题 (2.11)解题总结:区间乘法的优化
- 8.2 Git 与其他系统 - 迁移到 Git
- SICP 习题 (2.12)解题总结 :区间的不同实现方式
- SICP 习题 (2.13)解题总结:区间计算误差
- Java事务(八) - 分布式事务 - spring + JTA + atomikos
- 9.1 Git 内部原理 - 底层命令 (Plumbing) 和高层命令 (Porcelain)
- GCC内嵌汇编简单实例
- Unity获取游戏对象详解
- SICP 习题 (2.14)解题总结:区间误差导致的问题
- .net笔试 一
- SICP 习题 (2.15)解题总结:区间误差的深入思考