据我所知,递归函数通常比等效的非递归函数效率低,因为函数调用的开销。然而,最近我遇到一本教材说,在Java(和C#)中并非总是如此。
它没有说明原因,但我认为这可能是因为Java编译器以某种方式优化了递归函数。
有人知道这是为什么吗?
它没有说明原因,但我认为这可能是因为Java编译器以某种方式优化了递归函数。
有人知道这是为什么吗?
这通常只适用于尾递归(http://en.wikipedia.org/wiki/Tail_call)。
尾递归在语义上等同于增量循环,因此可以优化为循环。以下是我链接文章中的一句话(重点在我这里):
尾调用很重要,因为它们可以在不向调用堆栈添加新堆栈帧的情况下实现。当前过程的大部分框架不再需要,并且可以用相应的尾调用框架替换。然后程序可以跳转到被调用的子例程。生产这种代码而不是标准调用序列称为尾调用消除或尾调用优化。在函数式编程语言中,尾调用消除通常由语言标准保证,这个保证允许使用递归,特别是尾递归,代替循环。
以下是递归实现在某些情况下可以与迭代实现一样有效的原因:
然而,我的一般建议是不要担心这个问题-差异非常小,很不可能对您的整体性能产生影响。
Debunking the "Expensive Procedure Call" Myth
or, Procedure Call Implementations Considered Harmful
or, LAMBDA: The Ultimate GOTO