kat*_*uya 6 c# java recursion performance
据我所知,由于函数调用的开销,递归函数通常效率低于等效的非递归函数.但是,我最近遇到了一本教科书,说Java(和C#)并不是必需的.
它没有说明原因,但我认为这可能是因为Java编译器以某种方式优化了递归函数.
有谁知道为什么会这样的细节?
教科书可能是指尾调优化; 有关详细信息,请参阅@ Travis的答案.
但是,在Java的上下文中,教科书是不正确的.当前的Java编译器没有实现尾调用优化,显然是因为它会干扰Java安全实现,并且会出于各种目的改变对调用堆栈内省的应用程序的行为.
参考文献:
有一些提示,尾部调用优化可能会进入Java 8.
这通常仅适用于尾递归(http://en.wikipedia.org/wiki/Tail_call)。
尾递归在语义上等同于增量循环,因此可以优化为循环。以下是我链接到的文章的引用(强调我的):
尾部调用很重要,因为它们可以在不向调用堆栈添加新的堆栈帧的情况下实现。当前程序的大部分框架不再需要,可以用尾部调用的框架代替,并进行适当修改。然后程序可以跳转到被调用的子程序。生成这样的代码而不是标准调用序列称为尾调用消除或尾调用优化。在函数式编程语言中,尾调用消除通常由语言标准保证,并且这种保证允许使用递归,特别是尾递归来代替循环
归档时间: |
|
查看次数: |
2536 次 |
最近记录: |