使用foldr反转列表

时间:2012-10-23 15:50:44

标签: list scheme fold

如何定义一个函数来将列表反转为只有一次调用foldr?

看起来应该是这样的

(define (rev l)
    (foldr ___________________________

这是一个练习题考试,老师决定不为-.-

给出答案

1 个答案:

答案 0 :(得分:1)

如果您先阅读documentation,这将非常简单。您会发现foldr收到三个参数:

  • 要调用的过程,作为参数(按此顺序)接收从输入列表处理的当前元素和到目前为止的累积答案
  • 初始化值
  • 要处理的列表

现在想一想。如果我们要从头开始构建一个新列表,那么初始值是什么?我们将如何构建列表,可以使用哪些过程将元素组合在一起?当然,最后一个参数是输入列表。

唯一棘手的部分是定义程序。鉴于您到目前为止收到了一个元素和累积答案,您如何将该元素放在累加器的末尾?提示:这是程序的一般结构,填写缺失的部分:

(lambda (element accumulator) <???>)

额外提示:通过阅读文档,您将了解foldr从左到右处理输入列表。要查看此内容,请将cons作为第一个参数传递给foldr,您将看到它只是按原样复制输入列表。将此与foldl进行对比,cons似乎从右到左处理列表 - 如果您将foldl作为第一个参数传递给{{1}},则新创建的列表将被撤消。