zoukankan      html  css  js  c++  java
  • 拾遗:关于“尾递归”- tail recursion

    定义[个人理解]

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

    优执:

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

    局限:

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

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

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

    示例:

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

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

    结论:

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

  • 相关阅读:
    CentOS FTP基于虚拟用户的配置
    CentOS6.5 FTP配置
    MAC 隐藏文件的显示
    nignx知识点总结
    什么是函数式编程
    javascript有用代码片段
    PHP百杂
    好文:javascript中的四种循环
    好文:node.js最佳实践
    好文:不使用匿名函数的三个理由
  • 原文地址:https://www.cnblogs.com/hadex/p/6823303.html
Copyright © 2011-2022 走看看