練習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 n d k)
(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))))
這道習題我們就此完成了,再接再厲完成這一節的最後一題。不對,反面還有一題。
SICP練習 7 練習1 11
這種題目太像是數學題目了,不過拿到程式設計上又有一些的難度。我們先根據題目中的條件,寫出類似於第 25頁最下面的變換規則。我們先列出如下內容 a f n 1 f 2 f 3 f 4 f 5 b f n 2 f 1 f 2 f 3 f 4 c f n 3 f 0 f 1 f 2 f 3 於是繼而得出下...
SICP練習 12 練習1 18
練習1.8 和前兩題一樣,依舊是只能用對數步數。而且這個迭代過程要基於加 加倍和折半運算。這乙個習題要用到前面的函式,因此最好的做法是,每次都將寫好的 儲存起來。load test1.18.scm 這行 可以用來載入 而儲存可以用c x,c w。以下是該題的 這次我們寫成塊結構 define x y...
SICP練習 17 練習1 23
練習1.23 首先我們按照題目要求來寫出相應的next函式,然後再修改find divisor函式。define next x if x 2 3 n 2 define find divisor ntest divisor cond square test divisor n n divides?te...