我无法理解尾递归和List.fold_left
之间的区别?
有什么区别?我什么时候应该使用Tail递归和List.fold_left
?
答案 0 :(得分:4)
如果你的问题是“我怎么能使用尾递归我无法使用fold_left
,反之亦然”,答案是:
使用fold_left
可以实现的任何东西都可以使用尾递归来实现,因为fold_left
本身通常使用尾递归来实现。使用尾递归可以实现以下内容,但不能fold_left
:
答案 1 :(得分:2)
List.fold_left
是迭代序列的功能概括。它是一个函数,它接受一个列表,一些初始值,并按顺序将此函数应用于列表的每个元素。这是函数式编程中众所周知的higher order函数。它通常用于循环和迭代,而不是直接使用递归。
当对函数本身进行调用时,尾递归是尾调用的一个特例。基本上,如果调用是函数中的最后一个表达式,则调用是tail。因此,在通话之后,不需要再进行任何评估。尾部调用在OCaml中进行了优化,过于简单的迭代,即它们不会像正常调用一样消耗堆栈。
使用递归实现 List.fold_left
,并且标准实现中的所有递归调用都处于尾部位置。还有一个List.fold_right
有时会递归地实现非尾部。