SICP 習題 1 25 解題總結

2021-06-18 07:50:46 字數 877 閱讀 9009

sicp 習題 1.25 就是我上面說過的傷自尊的題了。

習題1.25說到有個叫allyssa p. hacker的人說expmod過程完全沒有必要搞那麼麻煩,直接使用前面的fast-expt過程和remainder過程就好了,她(叫alyssa的應該是女的吧)覺得可以這樣定義expmod:

(define (expmod base exp m)

(remainder (fast-expt base exp) m))

天哪!我就是這麼想的呀,我覺得沒什麼問題呀!

不過,既然題目這麼列出來,肯定是有問題啦,在中國接受應試教育這麼長時間,揣摩出題者的心理還是有一套的。

我想來想去沒想到使用fast-expt和remainder有什麼問題,和前面習題中定義的expmod一樣是對數步數的時間複雜度,憑什麼說fast-expt不行?

後來就去網上查答案,因為我確實想不到答案了。

找到後面發現問題在於長數字的處理,使用習題1.24中的expmod過程,計算時將大數拆成小的數進行計算,計算完了直接取模,返回結果不會大於取模的數,所以不會出現很長的數。

而使用fast-expt和remainder來定義expmod的話,先計算出a的n次方,這個數可能會很大很大,所以數字會很長很長。然後再進行remainder計算就會消耗很長時間。

最終的原因是scheme提供了對任意長整數的支援,但是當數字太長時,系統處理這個數的時候就會消耗很長的時間。

說到最簡單,就是說計算2*3和計算2000000000000000000000000000*3在scheme中所需要的時間是不同的,而且後者可能需要前者好幾倍的時間。

這就是習題1.25題的結果,乙個我沒有猜想到的結局,當然,我連故事的開頭都沒有猜到,怎麼會猜到故事的結局呢!!!

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 29)解題總結

sicp 習題 1.29 要求辛普森規則求函式f在範圍a 和 b之間的定積分的近似值。在經過前面習題的磨練之後,我對這種充滿數學定義的題目已經麻木了,覺得自己能完成題目就行,有些時候不需要去理會哪些折磨人的數學定義,比如什麼函式的定積分,更不用說什麼辛普森規則。其實sicp在1.3.1這節主要講的是...