SICP 習題 (1 38)解題總結

2021-06-22 12:15:58 字數 1371 閱讀 9801

sicp 習題1.38 緊跟著習題1.37的方向,要求我們用習題1.37中定義的cont-frac過程計算數學家尤拉大師在**de fractionibus continuis 中提到的e-2的連分式。說實話,我不知道**de franctionibus continuis講的是什麼,我甚至不知道**的題目是什麼意思。不過,這一切都不能阻止我這個數學盲去解答這道sicp習題。

仔細閱讀題目,我們可以發現題目要求我們計算的是下面這樣的無窮連分式:

其中n永遠等於1, d等於1 ,  2 , 1 , 1 , 4 , 1 , 1 , 6 , 1 , 1 , 8 …

所以我們呼叫cont-frac時給的n比較簡單,就是乙個永遠返回1的lambda過程,過程如下:

[plain]view plain

copy

(lambda (i) 1.0)  

而呼叫cont-fract時給的d複雜一點點,d是乙個lambda過程,能根據下標生成1 ,  2 , 1 , 1 , 4 , 1 , 1 , 6 , 1 , 1 , 8 …這樣的數列。

這個數列規律還是比較明顯,稍微費點腦筋可以做個lambda過程來生成,我做的過程如下:

[plain]view plain

copy

(lambda (i)   

(if (= (remainder (+ i 1) 3) 0)  

(* (/ (+ i 1) 3) 2)  

1))  

所以,下面的呼叫就可以得出e-2的值了:

[plain]view plain

copy

(cont-frac   

(lambda (i) 1.0)  

(lambda (i)   

(if (= (remainder (+ i 1) 3) 0)  

(* (/ (+ i 1) 3) 2)  

1))  

k)  

以上結果再+2就等於e了,我的完整測試過程如下:

[plain]view plain

copy

(define (e-test k)  

(+ 2 (cont-frac   

(lambda (i) 1.0)  

(lambda (i)   

(if (= (remainder (+ i 1) 3) 0)  

(* (/ (+ i 1) 3) 2)  

1))  

k)))  

結束!!

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...