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
是一个使用它的函数吗?你的问题很不清楚…新来者的典型困惑之一。。。