• 拾遗:关于“尾递归”- tail recursion


    定义[个人理解]

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

    优执:

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

    局限:

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

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

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

    示例:

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

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

    结论:

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

  • 相关阅读:
    C# VideoAPI
    C# 列出进程
    利用SQL为Code128码添加起始符和休止符
    SQL sysobjects 表 详解
    跳过从Win7/8升级,直接格式化全新安装 Windows 10 并自动永久激活系统的方法教程
    SQL EXCEPT INTERSECT
    C# 重启程序本身
    SQL HAVING 子句使用
    SQL over的作用及用法
    SQL 游标 Cursor 基本用法
  • 原文地址:https://www.cnblogs.com/hadex/p/6823303.html
Copyright © 2020-2023  润新知