原理

调用一个函数时,就会形成一个调用帧;在A函数内部执行B函数:当调用A函数时形成一个A的调用帧,在A函数内部调用B函数,在A调用帧上又会生成B调用帧,B执行完毕时B调用帧消失,A完毕后A调用帧消失;如果B是在A函数最后执行,那么A调用帧就可以直接消失。

function A(){function B(){}return B(); // 要有return这个才是最后
}

注意一点,这时B函数不能使用A函数内部的变量,下面这个就不行。

function A(){let one = 1;function B(){console.log(one);}return B(); // 要有return这个才是最后
}

尾递归优化

根据上面的原理,我们就可以使用尾递归来对递归调用进行优化。像求斐波那契数列和求n的阶层,都可以使用尾递归优化。
没有优化的求菲波那切数列

function feib(n){if(n<=1){return 1}return feib(n-1) + feib(n-2)
}
console.log(feib(100));

递归非常消耗内存,应为有非常多的调用帧,很容易栈溢出;使用尾递归优化,使得函数只有一个调用帧,就不会栈溢出了:

function feib(n,pre = 1, cur = 1) {if (n <= 1) {return cur;}return feib(n-1, cur, cur + pre)
}

目前只有 Safari 浏览器支持尾调用优化,Chrome 和 Firefox 都不支持
这个求菲波那切数列变快的原因还有一个很重要的原因就是思路变化了。之前是求n个要先求n-1和n-2;n-1又要求n-2和n-3;n-2要求n-3和n-4,这里就开始重复求值了;优化后,实际就是按顺序从1+1得到的值递归求feib(n,1,2),这个n就是此时,前一个求得的值给后一个。

尾递归优化 - 尾递归优化相关推荐

  1. php 尾递归,关于尾递归的使用详解

    这几天看到几篇关于尾递归的文章,之前对尾递归没有多大概念,所以回头研究了一下尾递归. 尾递归的概念 尾递归(Tail Recursion)的概念是递归概念的一个子集.对于普通的递归,由于必须要记住递归 ...

  2. mysql字段优化_MySQL优化(1):字段的设计

    Web项目中,当Java或者Go等语言速度提升到瓶颈的时候,我们需要关心MySQL的优化 可以优化的方面有很多:设计表.负载均衡.读写分离.SQL语句优化等 (1)IP地址设计 例如我们需要存储IP地 ...

  3. android布局优化方案,Android启动优化-布局优化

    Android启动优化-布局优化 安卓应用开发发展到今天,已经成为一个非常成熟的技术方向,从目前的情况看,安卓开发还是一个热火朝天的发展,但高级人才却相对较少,如今移动互联网的开发者也逐渐开始注重插入 ...

  4. 【C++ 语言】面向对象 ( 函数重载 | 运算符重载 | 运算符重载两种定义方式 | 拷贝构造方法 | RVO 优化 | NRVO 优化 )

    文章目录 函数重载 运算符重载 ( 类内部定义云算符重载 ) 运算符重载 ( 类外部定义运算符重载 ) 可重载的运算符 拷贝构造方法 编译器优化 ( RVO 优化 | NRVO 优化 ) 完整代码示例 ...

  5. Android性能优化 - 内存优化

    性能优化系列阅读 Android性能优化 性能优化 - 消除卡顿 性能优化- 内存优化 性能分析工具 - TraceView Android性能分析工具 为什么内存优化? 在一个商业项目中,很有可能因 ...

  6. 高级SQL优化(三) 常用优化工具 ——《12年资深DBA教你Oracle开发与优化——性能优化部分》...

    目录: Oracle数据完整性和锁机制  索引及优化之表分析  表分析.约束及表间关系  Oracle体系结构1 Oracle体系结构2  海量数据库及分区1  海量数据库及分区2  海量数据库及分区 ...

  7. 【学习笔记】多重背包相关优化——二进制优化/单调队列优化

    多重背包--二进制优化/单调队列优化 二进制优化 单调队列优化 代码都是 POJ1742 的,注意,那道题二进制优化会超时. 普通的多重背包式子,物品个数限制:c[i]c[i]c[i],单个物品价值 ...

  8. 02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法(作业:优化方法)

    文章目录 1. 梯度下降 2. mini-Batch 梯度下降 3. 动量 4. Adam 5. 不同优化算法下的模型 5.1 Mini-batch梯度下降 5.2 带动量的Mini-batch梯度下 ...

  9. 02.改善深层神经网络:超参数调试、正则化以及优化 W2.优化算法

    文章目录 1. Mini-batch 梯度下降 2. 理解 mini-batch 梯度下降 3. 指数加权平均数 4. 理解指数加权平均数 5. 指数加权平均的偏差修正 6. 动量Momentum梯度 ...

  10. vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn

    vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn 原创ChrisWang_ 最后发布于2019-05-24 10:25:58 阅读数 1332  收藏 展开 vue性 ...

最新文章

  1. Kali Linux WPScan更新到2.9.3
  2. 绝对Linux服务器管理利器webmin
  3. Java 面试知识点解析(五)——网络协议篇
  4. java如何计算时间天数差,java计算两个时间相差天数的方法汇总
  5. OPC的数据访问方法分别有同步访问、异步访问和订阅式
  6. 九十、动态规划系列背包问题之多重背包
  7. 长文总结半监督学习(Semi-Supervised Learning)
  8. redis java根据value排序_Redis高级特性——排序
  9. Spring Boot 2.0 开源项目--云收藏。收藏你所喜欢的一切。
  10. 服务注册中心,Eureka与Zookeeper比较
  11. Dropout和BN层的模式切换
  12. 一步步入门搭建SpringSecurity OAuth2(密码模式)
  13. centos安装思源黑体
  14. python爬取图书信息_Python爬取当当、京东、亚马逊图书信息代码实例
  15. 信息学竞赛学不学计算机史,关于信息学奥赛不得不知道的事
  16. windows11微软拼音输入法(自带输入法)修复
  17. 可替代50欧姆_50欧姆阻抗四层板射频信号隔层参考做不了吗?
  18. android德地图点聚合,点聚合-点标记-示例中心-JS API 示例 | 高德地图API
  19. SSD固态盘 _测试总结
  20. GSM模块_常用AT指令详解

热门文章

  1. 嵌入式系统硬件构成-嵌入式系统硬件体系结构
  2. 使用react-cropper结合图片压缩方法对图片进行裁剪压缩处理
  3. 47、SimpleOrientationSensor
  4. Elasticsearch 如何实现时间差查询?
  5. 单片机——LCD1602
  6. A081_Lucene_ElasticSearch
  7. c语言编程文件打不开,c语言fopen打开文件失败的原因是什么?
  8. 【Java】Prim最小生成树
  9. jquery slideToggle() 效果
  10. Gunicorn-配置详解