据我了解,由于函数调用的开销,递归函数的效率通常低于等效的非递归函数。但是,我最近遇到一本教科书,说这对于 Java(和 C#)不是必需的。
它没有说明原因,但我认为这可能是因为 Java 编译器以某种方式优化了递归函数。
有人知道为什么会这样吗?
最佳答案
教科书可能指的是尾调用优化;有关详细信息,请参阅@Travis 的回答。
但是,教科书在 Java 上下文中是不正确的。当前的 Java 编译器没有实现尾调用优化,显然是因为它会干扰 Java 安全实现,并且会改变出于各种目的对调用堆栈进行内省(introspection)的应用程序的行为。
引用资料:
- Does the JVM prevent tail call optimizations?
- 这Sun bug请求尾调用支持......仍然开放。
- This page (和引用论文)表明也许它毕竟不是那么难......
有迹象表明尾调用优化可能会进入 Java 8。
关于c# - Java中递归和非递归函数的效率比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5267730/