尾递归和堆递归函数有什么区别?

时间:2013-07-24 07:03:14

标签: functional-programming tail-recursion

在纯函数式语言中,比如将factorial函数写成,

fact.0 = 1
fact.n = n*fact.n-1

因为这个函数是堆栈递归的,所以有人能解释堆栈递归和告诉递归函数之间的区别吗?

提前致谢。

1 个答案:

答案 0 :(得分:3)

尾递归和堆栈递归(正如你所说)之间的区别在于尾递归函数可以转换为不使用调用堆栈的命令式代码(即,基本上是一个while循环),而使用堆栈递归时,堆栈深度与递归深度成正比。这可能意味着程序溢出堆栈。

请注意,“转换为命令式代码”是代码生成中常见的内容,因为编译器的输出语言通常是Assembly,C或其他一些低级命令式语言。

请注意,这与功能语言甚至纯函数语言无关,在每种支持递归的语言中都存在相同的问题。只有在某些函数式语言中,递归才是循环的唯一方法。