尾递归与List.fold_left

时间:2015-04-01 22:12:10

标签: ocaml

我无法理解尾递归和List.fold_left之间的区别?

有什么区别?我什么时候应该使用Tail递归和List.fold_left

2 个答案:

答案 0 :(得分:4)

如果你的问题是“我怎么能使用尾递归我无法使用fold_left,反之亦然”,答案是:

使用fold_left可以实现的任何东西都可以使用尾递归来实现,因为fold_left本身通常使用尾递归来实现。使用尾递归可以实现以下内容,但不能fold_left

  • 你在迭代除了列表之外的东西的任何东西(假设你正在迭代直到整数为0)。
  • 您在列表中迭代的任何内容,但不能一次迭代一个元素。
  • 您在列表中进行迭代的任何内容,但您可能会在到达结尾之前停止。

答案 1 :(得分:2)

List.fold_left是迭代序列的功能概括。它是一个函数,它接受一个列表,一些初始值,并按顺序将此函数应用于列表的每个元素。这是函数式编程中众所周知的higher order函数。它通常用于循环和迭代,而不是直接使用递归。

当对函数本身进行调用时,尾递归是尾调用的一个特例。基本上,如果调用是函数中的最后一个表达式,则调用是tail。因此,在通话之后,不需要再进行任何评估。尾部调用在OCaml中进行了优化,过于简单的迭代,即它们不会像正常调用一样消耗堆栈。

使用递归实现

List.fold_left,并且标准实现中的所有递归调用都处于尾部位置。还有一个List.fold_right有时会递归地实现非尾部。