let rec x1() = x1();()
let rec x2() = x2();;

调用x1();;在调用x2();时产生堆栈溢出使程序无限期运行。这两个功能有什么区别?

最佳答案

let rec x1() = x1();()

此函数不是尾递归的。它自称x1();当此调用返回时,该函数将返回一个单位()。
let rec x2() = x2();;

这个函数在最后调用自己。因此,编译器可以执行尾部调用优化-这意味着递归函数调用将永远不会耗尽所有堆栈空间。

本页说明尾部递归:http://ocaml.org/learn/tutorials/if_statements_loops_and_recursion.html#Tailrecursion-这是功能编程语言所使用的一项基本技术,因此我们可以使用递归来实现循环而不会耗尽内存。

当我阅读Smashing The Stack For Fun And Profit时,我首先了解了进程堆栈;我仍然认为它对流程栈的所有内容都有最好的描述。

关于recursion - 这两个递归ocaml函数之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22161024/

10-13 09:14