Erlang中的Tail Recursion vs Forward递归

时间:2011-02-09 08:53:28

标签: recursion erlang tail-recursion

对于erlang中的性能,尾递归是否比向前递归更好? 或者erlang编译器也优化了前向递归? 我的意思是,有没有理由使用尾递归而不是前向递归? 在我看来,前向递归看起来更漂亮。

2 个答案:

答案 0 :(得分:10)

尾递归和前向递归是完全不同的概念。 请参阅此discussion

可以编写一个尾递归的前向递归,从而进行优化。也可以编写一个非尾递归的前向递归:在这种情况下,它不会被优化,即它会消耗堆栈空间。

答案 1 :(得分:3)

尾递归通常更好,因为它使用更少的内存。您只需将所需内容带到下一次调用,从而最大限度地减少堆栈上的内存利用率。此外,当优化尾递归代码时,抛弃不需要的函数返回,这将使其在某些情况下稍微快一些。

例如,如果函数的返回值是对另一个函数的调用,则不需要将中间函数保留在堆栈上。因此代码会从内部函数直接跳回调用者。

在某些情况下,Erlang编译器会对非尾递归进行优化以进行尾递归,但不要依赖它。让它成为编写尾递归函数的好习惯。