Scheme 累积函数

Scheme 累积函数,scheme,sicp,Scheme,Sicp,在计算机程序的结构和解释(SICP)中,使用以下公式定义了若干功能: (accumulate cons nil (filter pred (map op sequence))) 两个使用此函数的示例操作斐波那契数列表,偶数fibs和列出fib平方 累积、过滤和映射功能也在第2.2节中定义。让我困惑的是,为什么作者在这里包含了acculate累积采用3个参数: 要应用的二进制函数 初始值,用作函数最右边的参数 将应用该函数的列表 使用本书中的定义将累积应用于列表的示例

在计算机程序的结构和解释(SICP)中,使用以下公式定义了若干功能:

(accumulate cons nil 
  (filter pred
         (map op sequence)))
两个使用此函数的示例操作斐波那契数列表,
偶数fibs
列出fib平方

累积、过滤和映射功能也在第2.2节中定义。让我困惑的是,为什么作者在这里包含了
acculate
<代码>累积采用3个参数:

  • 要应用的二进制函数

  • 初始值,用作函数最右边的参数

  • 将应用该函数的列表

使用本书中的定义将累积应用于列表的示例:

    (accumulate cons nil (list 1 2 3))
    => (cons 1 (cons 2 (cons 3 nil)))
    => (1 2 3)
由于第三个参数是一个列表,
(acculate cons nil some list)
将只返回
some list
,在这种情况下,
(filter pred(map op sequence))
的结果是一个列表


除了与本节中其他类似结构的函数保持一致之外,使用
accumulate
还有其他原因吗?

我确信
accumulate
的这两种用法仅仅说明了“考虑元素来构造列表”这一事实可以被视为一个累积过程,就像“相乘得到乘积”或“求和得到总数”一样。你是对的,这种积累实际上是不可操作的


(旁白:请注意,如果
过滤器
的输出和
累积
的输入不是列表,例如,如果它表示延迟生成的序列,那么这显然是一个更有用的操作。)

这里似乎也有意复制偶数FIB的结构:以说明相似之处。同样重要的是,如果继续使用scheme,标准库foldr可能能够处理列表以外的不同形式的序列,如果希望结果是列表,则比较合适。(这是我能想到的唯一一种情况,你可能想做这种事情。)啊,这是有意义的,可以使用非列表序列,这是对早期的偶数fibs函数的一种机械转换。谢谢你们两位,自从我本周早些时候读到这篇文章以来,这一直困扰着我。我只是想澄清一下,“积累[在那里,用
(accurate cons nil…
)实际上是不可行的”。但是在
(let((cons+)(nil 0))
下,
(cons nil…
将是完全不同的事情。