SICP 習題 (2.12)解題總結 :區間的不同實現方式

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章