3
let rec x1() = x1();()
let rec x2() = x2();;
调用x1();;产生一个堆栈溢出,而调用x2();;导致程序无限期地运行。这两个功能有什么区别?这两个递归ocaml函数有什么区别?
let rec x1() = x1();()
let rec x2() = x2();;
调用x1();;产生一个堆栈溢出,而调用x2();;导致程序无限期地运行。这两个功能有什么区别?这两个递归ocaml函数有什么区别?
let rec x1() = x1();()
此函数不是尾递归。它自己调用x1();当这个调用返回时,函数将返回一个单位()。
该函数在最后调用自己;因此编译器可以执行尾部调用优化 - 这意味着递归函数调用永远不会耗尽所有堆栈空间。
本页解释尾递归:http://ocaml.org/learn/tutorials/if_statements_loops_and_recursion.html#Tailrecursion - 这是函数式编程语言使用的基本技术,因此我们可以使用递归实现循环而不会耗尽内存。
我第一次在读到Smashing The Stack For Fun And Profit时了解了工艺堆栈;我仍然认为它对流程堆栈的全部内容有最好的描述。