拾遗:关于“尾递归”——tail recursive
Posted 纯原创,零转载
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拾遗:关于“尾递归”——tail recursive相关的知识,希望对你有一定的参考价值。
定义[个人理解]:
尾递归,即是将外层得出的常量计算因子,以函数参数的形式逐层向内传递,即内层调用整合外层调用的产出,整个递归的结果最终由最内层的一次函数调用得出;而通常的递归则是外层调用阻塞、等待内层调用的产出,最后由最上层的一次函数调用得出最终结果。
优执:
适度应用,可以带来效率的提升,同时在一定程度上提升程序的稳定性。
局限:
效率提升取决于编译器的优化策略,最终结果存在不确定性,即使内层调用在逻辑上已可独立运行;
仅可作为潜在的效率提升措施,但不能做为循环的替代,因为其不能保证 100% 避免栈溢出风险;
现代编译器已足够智能,结构简单的普通递归可被自动优化为尾递归,过度沉迷尾递归的结构得不偿失。
示例:
如在 clang-4.0 环境下, 本在已测试良好的尾递归函数中添加如下两句,将导致尾递归失效,从而爆栈使程序崩溃!
int A[1024 * 1024 * 8]; printf("%p", &A);
结论:
偶尔惊艳,但不实用,不可作为常规手段。
以上是关于拾遗:关于“尾递归”——tail recursive的主要内容,如果未能解决你的问题,请参考以下文章
通过阶乘的例子,练习在JavaScript, Scala和ABAP里实现尾递归(Tail Recursion)