SICP 習題 (2.12)解題總結 :區間的不同實現方式,sicp2.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。