首页 > 代码库 > SICP 习题 (2.12)解题总结 :区间的不同实现方式

SICP 习题 (2.12)解题总结 :区间的不同实现方式

SICP 习题 2.12 要求我们定义一个构造函数make-center-percent,它接收两个参数,分别代表中心点和一个误差百分比。我们需要通过这个构造函数产生一个区间。此外还需要定义一个选择函数percent,用来获取指定区间的误差百分比。还有就是需要实现一个center函数用于获取区间的中间点。

 

这里的关键就是要我们明白一个复合数据类型可能会有不同的表现形式,比如这里的区间可以用起点和终点表示,也可以使用中心点和误差表示。

 

从 内部实现来讲,可以简单的将两种表现形式相关的数据都保存起来,比如我们同时记录区间的起点、终点、中心点和误差。但是这样我们就需要在数据更新时同时两 种数据,比如我们获得了新的起点和终点数据,那我们就必须同时更新起点,终点,中心点和误差这些数据,而新的中心点和误差可以根据新的起点和终点计算出 来。

 

既然都是需要转换,另一中实现思路就是只保留一种形式的数据,当获得另一种形式的数据时通过计算转换成第一种数据。

 

所以,在这里我们就依然采用之前的起点和终点的区间数据保存形式,当我们通过make-center-percent构建区间时就通过计算把中心点和误差百分比转换成起点和终点。

 

代码如下:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. (define (make-center-percent center percent)  
  2.   (make-interval (- center (* center (/ percent 100))) (+ center (* center (/ percent 100)))))  



这样,获取中心点的代码和书中就是一样的了,通过起点和终点相加再除于2可以得到:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. (define (center i)  
  2.   (/ (+ (lower-bound i) (upper-bound i)) 2))  

 

当我们知道一个区间的起点和终点,就可以通过计算宽度再得出误差偏移量,再把偏移量除于中心点就可以得出误差相对于中心点的百分比了。这里要注意的时书中对区间宽度的定义是起点到终点距离的一半,所以这里的区间宽度恰好是它的误差偏移量。计算误差百分比的代码如下:

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  1. (define (percent i)  
  2.   (* 100 (abs  (/ (interval-width i) (center i))))) 

SICP 习题 (2.12)解题总结 :区间的不同实现方式