SICP練習 26 練習1 32

2021-09-23 23:29:36 字數 1570 閱讀 9238



練習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,還有後面的無數多個。既然有了想法,那麼就開工吧。...