SICP 習題 (1.45)解題總結

SICP 習題 1.45是對前面很多關於不動點的習題的總結。


題目回顧了我們之前在1.3.3節使用的不動點尋找方法,當尋找y -> x/y 的不動點的時候,這個變換本身不收斂,需要做一次平均阻尼纔可以。


對於y -> x/(y^2)這個變換也可以通過一次平均阻尼使它變得收斂。


不過一次平均阻尼對於四次方程是不夠的,就是說,對y -> x/(y^3)這樣的變換,一次平均阻尼不足以使它收斂,需要做兩次平均阻尼纔行。


題目遵從一直以來的抽象原則,要求我們去多做幾次測試,找出 y -> x / (y^n)這樣的變換需要幾次平均阻尼。


先看看目前我們知道的規律,

y -> x/(y^1) 需要1次平均阻尼

y -> x/(y^2) 需要1次平均阻尼

y -> x/(y^3) 需要2次平均阻尼


簡單猜得話會不會是需要n/2次平均阻尼呢?

單靠猜當然不行,我們需要測試幾次。


爲了方便測試,我寫了下面這樣的方法:



(define (n-rt x n try-average-time)
  (fixed-point ((repeat average-damp try-average-time) (lambda (y)  (/ x (fast-expt y (- n 1)) ) )) 1.0))


這樣就可以隨意指定n次方程和對應的平均阻尼次數,從5次方程開始測試,看看測試結果是否符合我的猜測。


測試發現我的猜測太不靠譜了,測試發現4,5,6,7次方程都可以通過2次平均阻尼實現收斂。


繼續猜得話就猜(lg n)次了,說實話我的數學敏感度還沒到一下就往(lg n)次猜得程度,看了自己的很多次測試結果,結合網上一些同學們的解題過程才定位到(lg n)上的。


當然,這次猜對了。


最終我寫的方法如下:


(define (final-n-root x n)
  (define (nth-root n)
    (n-rt x n (lg n)))
  (nth-root n))


以上方法調用了之前定義的用於測試的n-rt過程,只是簡單的使用(lg n)去計算需要平均阻尼的次數。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章