【问题标题】:How do foldl and foldr work, broken down in an example?foldl 和 foldr 如何工作,在一个例子中分解?
【发布时间】:2017-06-27 21:32:35
【问题描述】:

好的,我是 scheme/racket/lisp 的新手。我正在练习创建自己的函数、语法和递归,所以我想创建自己的 foldlfoldr 函数,它们的功能与预定义版本完全相同。我不能这样做,因为我只是不明白这些功能是如何工作的。我在这里看到过类似的问题,但我仍然不明白。一些分解的例子会有所帮助!这是我的(不正确的)过程:

(foldl - 0 '(1 2 3 4)) 我做0 -(4-3-2-1) 并得到正确答案 2

(foldl - 0 '(4 3 2 1))0-(1-2-3-4) 得到 8 但应该是 -2。

(foldr - 0 '(1 2 3 4))0-(1-2-3-4) 又得到 8,但应该是 -2。

(foldr - 0 '(4 3 2 1)) 我做0-(4-3-2-1) 并得到正确答案 2。

我做错了什么?

【问题讨论】:

标签: scheme lisp racket fold


【解决方案1】:

我们看一下:(foldr - 0 '(1 2 3 4))

这里的文字 '(1 2 3 4) 构造了一个列表,其元素是数字 1、2、3 和 4。让我们明确地构造列表:

(cons 1 (cons 2 (cons 3 (cons 4 empty))))

可以将foldr 视为一个函数,它将cons 替换为函数f,并用值v 替换为空。

因此

(foldr f 0 (cons 1 (cons 2 (cons 3 (cons 4 empty)))))

变成

           (f 1    (f 2    (f 3    (f 4 v)))))

如果函数f为-v的值为0,则得到:

(- 1 (- 2 (- 3 (- 4 0)))))

我们可以计算出结果:

  (- 1 (- 2 (- 3 (- 4 0))))
= (- 1 (- 2 (- 3 4)))
= (- 1 (- 2 -1))
= (- 1 3)
= -2

请注意,(foldr cons empty a-list) 会生成 a-list 的副本。

另一方面,函数foldl 使用另一端的值:

> (foldl cons empty '(1 2 3 4))
'(4 3 2 1)

换句话说:

(foldl f v '(1 2 3 4))

变成

(f 4 (f 3 (f 2 (f 1 v)))).

如果f是函数-并且值为0,那么我们得到:

  (- 4 (- 3 (- 2 (- 1 0))))
= (- 4 (- 3 (- 2 1)))
= (- 4 (- 3 1))
= (- 4 2)
= 2

请注意,(foldl cons empty a-list) 会产生 a-list 的反面。

【讨论】:

  • 请注意(- 1 3) = -2,因此(foldr - 0 '(1 2 3 4)) 的计算结果应为-2 而不是2。与foldl 相同,它应该是2 而不是-2。 (foldl f v '(1 2 3 4)) 应该变成 (f 4 (f 3 (f 2 (f 1 v))))
  • @AlexanderMaru 谢谢!我已经修正了错误。
  • @soegaard 非常酷的 foldl 演示;我从未见过像您在这里所做的那样使用扩展的cons 表单
  • 喜欢这种例子。谢谢!
  • 这是对foldr最好最简单的解释。我已经研究了这个主题一段时间,但我无法弄清楚 foldr 在做什么。你的解释太中肯了!谢谢!
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多