SICP練習 31 練習1 37

2021-09-23 23:33:43 字數 1381 閱讀 1487



練習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...