拾遗:关于“尾递归”——tail recursive

Posted 纯原创,零转载

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拾遗:关于“尾递归”——tail recursive相关的知识,希望对你有一定的参考价值。

定义[个人理解]

  尾递归,即是将外层得出的常量计算因子,以函数参数的形式逐层向内传递,即内层调用整合外层调用的产出,整个递归的结果最终由最内层的一次函数调用得出;而通常的递归则是外层调用阻塞、等待内层调用的产出,最后由最上层的一次函数调用得出最终结果。

优执:

  适度应用,可以带来效率的提升,同时在一定程度上提升程序的稳定性。

局限:

  效率提升取决于编译器的优化策略,最终结果存在不确定性,即使内层调用在逻辑上已可独立运行;

  仅可作为潜在的效率提升措施,但不能做为循环的替代,因为其不能保证 100% 避免栈溢出风险;

  现代编译器已足够智能,结构简单的普通递归可被自动优化为尾递归,过度沉迷尾递归的结构得不偿失。

示例:

  如在 clang-4.0 环境下, 本在已测试良好的尾递归函数中添加如下两句,将导致尾递归失效,从而爆栈使程序崩溃!

int A[1024 * 1024 * 8];
printf("%p", &A);

结论:

  偶尔惊艳,但不实用,不可作为常规手段。

以上是关于拾遗:关于“尾递归”——tail recursive的主要内容,如果未能解决你的问题,请参考以下文章

尾调用(Tail Call)

通过阶乘的例子,练习在JavaScript, Scala和ABAP里实现尾递归(Tail Recursion)

通过阶乘的例子,练习在JavaScript, Scala和ABAP里实现尾递归(Tail Recursion)

XSLT 2.0 中的尾递归函数不起作用

尾递归

如何看待以及理解Python的这种尾递归优化