尾递归(Tail-Recusive function)可以转换为循环
非尾部递归可以用
栈来转换
什么是尾部递归?-参阅 精通递归程序设计。
如何判断您的 JIT 能否转换尾递归:编译并运行如下程序 (参照提高Java代码的性能) ,如果您的 JIT 编译器把尾 递归 调用 转换 成迭代,这个程序将无限期地运行下去。它所需的内存很小,而且不会随时间增加。 如果 JIT 不做这种 转换 ,程序将会很快耗尽堆栈空间并报告一个堆栈溢出错误。
如何判断您的 JIT 能否转换尾递归:编译并运行如下程序 (参照提高Java代码的性能) ,如果您的 JIT 编译器把尾 递归 调用 转换 成迭代,这个程序将无限期地运行下去。它所需的内存很小,而且不会随时间增加。 如果 JIT 不做这种 转换 ,程序将会很快耗尽堆栈空间并报告一个堆栈溢出错误。
递归和非递归,其实都是一样的。非递归需要人为构建维护堆栈;递归只是系统在帮你维护堆栈而已。(摘自
如何用栈实现递归与非递归的转换)