sicp 習題1.31開始拔高我們的抽象能力,向更高的高度進發,以更好地理解高階函式。
習題1.31是基於1.30的。
在習題1.30中我們定義了累加的過程sum,其實我們可以發現,這種累積操作是可以做更高的抽象的。
在做更高的抽象之前讓我們看看使用乘法做累積的**是什麼樣的,這就是題目要求我們完成的第乙個任務,做函式值的乘積。
定義出來的過程如下:
(define (product term a next b)
(if (> a b)
1(* (term a)
(product term (next a) next b))))
可以發現,除了其中的+號變成了*號,初始值由0變成了1,這個過程和sum幾乎是一樣的。
另外,題目還要求我們實現迭代版的函式值乘積,定義出來的過程如下:
(define (product-iter term a next b )
(define (iter a result)
(if (> a b)
result
(iter (next a) (* (term a) result))))
(iter a 1))
同樣,迭代版的乘積累積過程和迭代版的累加過程幾乎是一樣的,除了*號代替+號,1代替0.
不知道在**聽說過,如果我們在重複輸入大量相同的**,肯定是**出問題了。
我們應該是把乘法的累積和加法的累積做成乙個抽象的叫「累積」的過程,然後將「乘法」或者是「加法」作為引數傳進去。
當然,這一切是在高階函式成立的條件下才可以做到的。
這就是後面的習題1.32要做的事情,更多的我們在下一題再討論。
回到習題1.31,題目還要求我們根據公式「pie/4=(2/3)*(4/3)*(4/5)*(6/5)*(6/7)*(8/7)…」求出pie的近似值。
其實我們可以將以上公式寫成下面這樣:
pie/4=f(1)*f(2)*f(3)*f(4)*f(5)*f(6)…f(k)
其中,如果k是偶數,f(k)=(k+2)/(k+1)
如果k是奇數,f(k)=(k+1)/(k+2)
使用scheme**定義的這個f(k)為:
(define (for-pie k)
(if (even? k)
(/ (+ k 2) (+ k 1))
(/ (+ k 1) (+ k 2))))
這樣我們可以利用上面的product過程來完成習題,定義的過程如下:
(define (generate-pie n)
(* (product for-pie 1 next-integer n) 4.0))
其中next-integer用於生成下乙個整數,過程如下:
(define (next-integer a) (+ a 1))
SICP 習題 1 14 解題總結
sicp 習題 1.14要求計算出過程count change的增長階。count change是書中1.2.2節講解的用於計算零錢找換方案的過程。要解答習題1.14,首先你需要理解count change的工作方式,要理解count change的工作方式,最好是自己去實現一遍count chan...
SICP 習題 1 22 解題總結
sicp 習題 1.22 要求改進題中列舉出來檢查素數的過程,用來求1000,10000,100 000,還有1000 000附近的素數,然後比較求這些素數的時間,看是否符合 n 的複雜度。要完成這道題首先要將題目中列出的過程照抄到你的scheme環境中。因為書中的 使用了 runtime 過程,我...
SICP 習題 1 25 解題總結
sicp 習題 1.25 就是我上面說過的傷自尊的題了。習題1.25說到有個叫allyssa p.hacker的人說expmod過程完全沒有必要搞那麼麻煩,直接使用前面的fast expt過程和remainder過程就好了,她 叫alyssa的應該是女的吧 覺得可以這樣定義expmod define...