SICP練習 67 練習2 38

2022-04-11 03:03:19 字數 931 閱讀 6215



練習2.38

這道題比較有意思了,我們先來將fold-left和accumulate模擬,accumulate是遞迴,而fold-left是迭代。前者通過不斷地將(op

result (car rest)變換成initial,通過將(cdr rest)變換成sequence,而rest一開始其實就是sequence,result一開始則是initial。

result

——(op result (car rest))

rest

——(cdr rest)

因此我們將(fold-left / 1 (list 1 2 3))展開如下:

(iter 1 『(1 2 3))

(iter (/ 1 1) 『(2 3))

(iter (/ (/ 1 1) 2) 『(3))

(iter (/ (/ (/ 1 1) 2) 3) 『())

(/ (/ (/ 1 1) 2) 3)

(/ (/ 1 2) 3)

(/ 1/2 3)

1/6既然書上說了accumulate又稱為fold-right,也就是accumulate的定義同樣適用於fold-right了。而它就更加簡單了:(/

1 (/ 2 (/ 3 1) ) ),也就是3/2。

將其中的值代換一下得到:(list 1 (list 2 (list 3 『() ) ) ),也就是(1 (2(3 () ) ) ),這就是第三小題的結果了。

而第四小題將第二小題的過程代換一下就是如此:(list (list (list 『() 1) 2) 3),也就是( ( ( 『()1) 2) 3)。

如果要讓fold-left和fold-right對任何序列產生相同的結果,那麼就需要傳說中的結合律了。不管從左邊操作過去,還是從右邊操作過來,都是一樣的結果。最簡單的就是加法了,而且and、or一類的函式也可以達到相同的效果。

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

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