sicp 習題 1.7 是對正文1.1.7節中的牛頓法求平方根的改進,改進部分是good-enough?過程。
原來的good-enough?是判斷x和guess平方的差值是否小於0.001,這個過程在一般情況下沒什麼問題,但是,當需要求平方根的目標本身比較小時就會出現問題。
比如我們求(sqrt-iter 1.0 0.00000016),我們口算都知道結果是0.0004,但是(sqrt-iter)返回的結果大概是0.03125,因為0.03125的平方是.0009765625 ,這個數本身就小於0.001,所以它和0.00000016的差值當然也小於0.001。
題中提到的更好的方法應該是計算兩次猜測的差值相對於上次猜測的比例,用一般數學公式表示就是( (guess - previous-guess) / previous-guess)這個數要足夠小。
理清了這個思路做起程式來就很方便了,首先定義is-small-part-of?過程如下:
(define (is-small-part-of? small-one big-one)
(< (abs (/ small-one big-one)) 0.001))
然後修改sqrt-iter為:
(define (new-sqrt-iter guess x previous-guess)
(if (is-small-part-of? (- previous-guess guess) previous-guess)
guess
(new-sqrt-iter (improve guess x) x guess)))
做完拿以下**測試一下,看結果相對於sqrt-iter是否有改進:
(new-sqrt-iter 1.0 0.00000016 0.00000016)
注意這裡的new-sqrt-iter呼叫的第三個引數,因為第三個引數是上一次猜測的平方根,當我們第一次猜測時沒有上一次,所以選乙個和當前猜測數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...