3

计算机程序的结构和解释(SICP)部分 2.2.3中定义了几个函数:

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

两个利用这个的例子对斐波那契数列进行操作,even-fibslist-fib-squares

累积、过滤和映射函数也在第 2.2 节中定义。让我感到困惑的部分是为什么作者将accumulate这里包括在内。accumulate接受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除了与本节中其他类似结构的功能保持一致之外,还有其他原因吗?

4

1 回答 1

5

我敢肯定,这两种用法accumulate只是说明“用元素构造一个列表”可以被视为一个累积过程,就像“将数字相乘以获得产品”或“将数字相加以获得共”可以。你说得对,积累实际上是一个空操作。

(旁白:请注意,如果 of 的输出filter和输入accumulate不是列表,这显然是一个更有用的操作;例如,如果它表示一个延迟生成的序列。)

于 2010-09-08T21:55:16.723 回答