SICP練習 13 練習1 19

2021-09-23 23:27:33 字數 828 閱讀 9757



練習1.19

題目中說道斐波那契數中將變換t的n次方應用於對偶(1,0)而產生出來,而現在將t看作t(pq)中p=0和q=1的特俗情況。因此對於對偶(a,b)來說,a—bq+a(p+q),b—bp+aq。而對於t(pq)的平方也就是(t(pq))^2,就像之前的a中往b乘以q和往a乘以(p+q),現在依舊是相當於a中往bp+aq乘以q(bp+aq為上一次迭代中的」b」),往(bq+a(p+q))中乘以(p+q),同樣的變換也發生在b中。依次對於t(pq)的平方來說,a—b(2pq+q*q)+a(p*p+q*q+2*p*q+q*q),b—b(p*p+q*q)+a(2pq+q*q)。

而再次通過對比我們發現p』=p^2+q^2並且q』=2pq+q^2。

所以當n為偶數時,我們又可以通過應用變換t(p』q』)來減少計算t^n的一半計算量,因此在這種情況下就可以寫出對數步數的斐波那契函式了。**如下:

(define(fib n)

(define (fib-iter a b p q n)

(cond ((= n 0) b)

((even? n) (fib-iter a b (+ (squarep) (square q)) 

(+(* 2 p q) (square q)) (/ n 2)))

((odd? n) (fib-iter (+ (* b q) (* aq) (* a p))

(+ (* b p) (* a q)) p q(- n 1)))))

(fib-iter 1 0 0 1 n))

再來一次測試:

(fib 0)

;value: 0

(fib 7)

;value: 13

SICP練習 13 練習1 19

練習1.19 題目中說道斐波那契數中將變換t的n次方應用於對偶 1,0 而產生出來,而現在將t看作t pq 中p 0和q 1的特俗情況。因此對於對偶 a,b 來說,a bq a p q b bp aq。而對於t pq 的平方也就是 t pq 2,就像之前的a中往b乘以q和往a乘以 p q 現在依舊是...

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