2010-09-08 48 views
3

結構和計算機程序(SICP)的解釋Section 2.2.3多個功能使用規定:SICP累加功能

(accumulate cons nil 
    (filter pred 
     (map op sequence))) 

兩個例子利用這個Fibonacci數,even-fibs的名單上運行, list-fib-squares

積累,過濾器和映射函數也在2.2節中定義。令我困惑的部分是爲什麼作者在這裏包含了accumulateaccumulate需要3個參數:

  • 的二元函數施加

  • 的初始值,作爲最右邊的參數給函數

  • 列表至該函數將應用於

使用書中的定義將累積應用於列表的示例:

(accumulate cons nil (list 1 2 3)) 
    => (cons 1 (cons 2 (cons 3 nil))) 
    => (1 2 3) 

由於第三個參數是一個列表,(accumulate cons nil some-list)只返回some-list,而在這種情況下(filter pred (map op sequence))結果列表。

除了與該部分中其他類似結構化函數的一致性,是否有這種使用accumulate的原因?

回答

5

我確定accumulate這兩個用途僅僅是說明「構成列表的構成要素」可以像「乘以數字獲得產品」一樣被當作一個累積過程,或者「總結數字以獲得總數」即可。你說的積累實際上是無效的。

(除了:請注意,此可顯着是一個更有用的操作如果filteraccumulate輸入輸出不是列表;例如,如果它表示的懶惰地生成的序列)

+0

它還似乎有意試圖在這裏複製even-fibs的結構:http://mitpress.mit.edu/sicp/full-text/book/book-ZH-15.html#%_idx_1724來說明相似之處。 – 2010-09-08 21:59:31

+0

需要注意的是,如果您繼續使用scheme,標準庫foldr可能能夠處理列表之外的不同形式的序列,並且如果您希望結果成爲列表,那麼consing可能是合適的。 (這是我能想到的唯一的另一種情況,你可能想要做這種事情。) – 2010-09-08 22:02:03

+0

啊,這很有道理,可以使用非列表序列,並且這證明了一種機械轉換早期的偶數函數。謝謝你們兩位,自從我在本週早些時候閱讀它以來,這一直在困擾着我。 – Jared 2010-09-08 22:10:14