這種題目太像是數學題目了,不過拿到程式設計上又有一些的難度。我們先根據題目中的條件,寫出類似於第
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)
於是繼而得出下式:
a—a+2b+3c
b—ac—b
也就是說,當n=5時,a為f(4),而根據題目條件f(4)=f(3)+2f(2)+3f(1),而上面的式子中f(4)正好和前一列的f(3)、f(2)、f(1)可以建立起聯絡。於是乎,每下一次迭代中的a都是由上一次的a+2b+3c轉換過來的;同理,對於b和c也是這樣的。將計算的過程羅列出來,系統的分析有助於我們解決問題。感謝裴同學的提醒,在部落格上加上這一段解釋。
於是核心部分已經出來了:
(f-iter (a+2b+3c) a b (- counter 1))
最終寫成**即可:
(define (f n)
(f-iter1 0 0 n))
(define (f-iter a b c count)
(if(= counter 0)
b(f-iter (+ a (* 2 b) (* 3 c)) a b (- count1))))
模擬其實是乙個很好的學習方法,在博主的【
scheme
歸納】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...
SICP練習 26 練習1 32
練習1.32 因為遞迴比迭代要更容易實現,因此我先考慮的遞迴。先將sum和product都列出來。define sum term a next b if a b 0 term a sum term next a next b define product term a next b if a b 1...