Ocaml 尾部递归vs List.fold\u left

Ocaml 尾部递归vs List.fold\u left,ocaml,Ocaml,我无法理解尾部递归和列表之间的区别。向左折叠 有什么区别?什么时候应该使用尾部递归,什么时候应该使用List.fold\u left?List.fold\u left是对序列进行迭代的一种函数泛化。它是一个函数,它获取一个列表和一些初始值,并将此函数按顺序应用于列表中的每个元素。这是函数式编程中众所周知的函数。它通常用于循环和迭代,而不是直接使用递归 尾部递归是尾部调用的一种特殊情况,当对函数本身进行调用时。基本上,如果调用是函数中的最后一个表达式,那么它就是tail。这样在调用之后就不需要再执

我无法理解尾部递归和列表之间的区别。向左折叠


有什么区别?什么时候应该使用尾部递归,什么时候应该使用List.fold\u left?

List.fold\u left
是对序列进行迭代的一种函数泛化。它是一个函数,它获取一个列表和一些初始值,并将此函数按顺序应用于列表中的每个元素。这是函数式编程中众所周知的函数。它通常用于循环和迭代,而不是直接使用递归

尾部递归是尾部调用的一种特殊情况,当对函数本身进行调用时。基本上,如果调用是函数中的最后一个表达式,那么它就是tail。这样在调用之后就不需要再执行任何评估了。尾部调用在OCaml中进行了优化,因为迭代过于简单,也就是说,它们不像普通调用那样消耗堆栈


List.fold_left
使用递归实现,标准实现中的所有递归调用都位于尾部位置。还有一个
列表。向右折叠
,有时以非尾部递归方式实现

List.fold_left
是对序列进行迭代的一种函数泛化。它是一个函数,它获取一个列表和一些初始值,并将此函数按顺序应用于列表中的每个元素。这是函数式编程中众所周知的函数。它通常用于循环和迭代,而不是直接使用递归

尾部递归是尾部调用的一种特殊情况,当对函数本身进行调用时。基本上,如果调用是函数中的最后一个表达式,那么它就是tail。这样在调用之后就不需要再执行任何评估了。尾部调用在OCaml中进行了优化,因为迭代过于简单,也就是说,它们不像普通调用那样消耗堆栈


List.fold_left
使用递归实现,标准实现中的所有递归调用都位于尾部位置。还有一个
列表。向右折叠
,有时以非尾部递归方式实现

如果您的问题是“我可以使用尾部递归做什么,而我不能使用
左折
,反之亦然”,答案是:

可以使用
fold\u left
实现的任何内容都可以使用尾部递归来实现,因为
fold\u left
本身通常使用尾部递归来实现。可以使用尾部递归实现以下内容,但不能使用左折叠:

  • 迭代列表以外的内容的任何内容(比如迭代直到整数为0)
  • 迭代列表,但每次不迭代一个元素的任何内容
  • 在列表上迭代,但在到达末尾之前可能会停止的任何内容
如果您的问题是“我可以使用尾部递归做什么,而我不能使用
左折叠,反之亦然”,答案是:

可以使用
fold\u left
实现的任何内容都可以使用尾部递归来实现,因为
fold\u left
本身通常使用尾部递归来实现。可以使用尾部递归实现以下内容,但不能使用左折叠

  • 迭代列表以外的内容的任何内容(比如迭代直到整数为0)
  • 迭代列表,但每次不迭代一个元素的任何内容
  • 在列表上迭代,但在到达末尾之前可能会停止的任何内容

尾部递归是一个编程概念,而
List.fold\u left
是一个使用它的函数吗?你的问题很不清楚…一个新来者的典型困惑…尾部递归是一个编程概念,而
List.fold\u left
是一个使用它的函数吗?你的问题很不清楚…新来者的典型困惑之一。。。