練習1.37
根據題目中的意思通過觀察得到k項有項連分式的一種表達方式:
f=n1/(d1+(n2/(…+nk/dk)))
這個式子可以不斷展開,但如果我們把每一個”+”後面的式子記作t(i)。不對,我們應該将每一個n/d記作t(i),因為這組式起始于n/d,且中止與n/d。計n1/d1為t(1),n2/d2為t(2),nk/dk為t(k)。在數學上可能不會聯想到遞歸,而是聯想到一個表達式,以謀求能夠化簡。但在這裡大家應該都發現了這是一個遞歸過程。
接着我們來寫出題目要求的(cont-fracn d k):
(define (cont-frac n d k)
(define (cont-frac-t i)
(if (= k i)
(/ (n k) (d k))
(/ (n i) (+ (d i) (cont-frac-t (+ i1))))))
(cont-frac-t 1))
下面我們利用題中給出的過程來寫一個黃金分割率的定義。
(define(cont-frac-golden-ratio k)
(+ 1 (cont-frac (lambda (i) 1.0)
(lambda (i) 1.0)
k)))
接下來我們按照題中的要去來測試一下剛才所寫的過程。
通過幾次測試之後得出的結論是當k為11時即有十進制的4位精度,而且k值越大精度越大。
(cont-frac-golden-ratio 11)
;value: 1.6180555555555556
好了,現在我們還要來考慮疊代版本。我們隻要記住疊代的空間需求是不變的,在題中的式子中,我們可以發現如下規律:
t(1)=n1/(d1+t(2))
t(2)=n2/(d2+t(3))
t(3)=n3/(d3+t(4))
……
t(k-2)=n(k-2)/(d(k-2)+t(k-1))
t(k-1)=n(k-1)/(d(k-1)+t(k))
tk=nk/dk
根據如下的表達式的規律,我們可以寫出疊代版本的cont-frac函數,像前面博文中所講,我們依舊應該添加一個存儲器,比如other。而不斷變化的other就是前面表達式從依次往下的最右邊的t。
(define (cont-frac-t i other)
(if (= i 0)
other
(cont-frac-t (- i 1) (/ (n i)
(+ (d i) other)))))
(cont-frac-t (- k 1) (/ (n k)
(d k))))
這道習題我們就此完成了,再接再厲完成這一節的最後一題。不對,反面還有一題。