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