練習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(* (term a)
(product term (next a) next b))))
通過對比我們發現,僅僅是有2個地方的區別。按照題中的要去,我們將0或1的位置用null-value代替,將+或*用combiner代替。在函式的引數中新增這兩個新的引數即可。通過對比,其實也不難嘛。
(define (accumulate combinernull-value term a next b)
(if (> a b)
null-value
(combiner (term a) (accumulate combinernull-value term (next a) next b))))
題中還要求我們定義出sum和product來,這裡我就列出sum的遞迴accumulate版本。
(define (sum term a next b)
(accumulate + 0 term a next b))
接下來我們再看看如何寫出迭代版本的accumulate。還是一樣,先列出迭代版本的sum和product。
(define (sum term a next b)
(define (sum-iter a other)
(if (> a b)
other
(sum-iter (next a)
(+(term a) other))))
(sum-iter a 0))
(define (product term a next b)
(define (product-iter a other)
(if (> a b)
other
(product-iter (next a)
(* (term a) other))))
(product-iter a 1))
同樣是通過模擬,我們又可以寫出迭代版本的accumulate。
(define (accumulate combinernull-value term a next b)
(define (accumulate-iter a other)
(if (> a b)
other
(accumulate-iter (next a)
(combiner (term a)other))))
(accumulate-iter a null-value))
這次我們就來寫迭代版本的product。
(define (product term a nextb)
(accumulate * 1 term a next b))
通過這些對比,感覺枯燥的遞迴和迭代還挺有意思的。
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...
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...
SICP練習 47 練習2 6
練習2.6 如果這道題還沒有做的請務必要先自己思考並檢驗。如果沒有能夠求出來,也可以在看完我推導的one之後自己再來推導two。一開始我也不懂題目中的兩個式子是什麼意思,甚至連怎麼用都不知道。但我猜測到是不是可以用這兩個式子來構造出one,以及two,還有後面的無數多個。既然有了想法,那麼就開工吧。...