从一个熟悉的Fibonacci数列的实现开始:

function Fibonacci (n) {if ( n <= 1) { return 1};return Fibonacci(n -1) + Fibonacci(n-2);
}

以上代码很简单…
但执行以下代码

console.log(Fibonacci(100));

会发现编译工具,卡住不动.
原因在于:递归调用(函数调用自身),每次都会占用一定内存来保存调用帧…Fibonacci(100),直接导致堆栈溢出…

解决方法:
改为尾递归调用(代码如下):

function Fibonacci2(n, ac1=1, ac2=1){if (n <= 1) {return ac2};return Fibonacci2(n-1, ac2, ac1+ac2);
}

执行以下代码看看:

console.log (Fibonacci2(100));
console.log(Fibonacci2(1000));


诶,成功了…
下面介绍优化的原理:

// 考虑函数:
function f(){let m = 1;let n =2;return g(m+n);
}
f();// 等同于
function f() {return g(3);
}
f();// 等同于
g(3)

函数f(),最后一步都是调用g().
最终的调用帧可以缩减到1个g(3)…
因此大大的减少了内存的消耗

参考 《ES6标准入门》(第3版) P126

javascript --- 函数的优化(尾调用优化)相关推荐

  1. 递归循环一个无限极数组_理解递归、尾调用优化和蹦床函数优化

    想要理解递归,您必须先理解递归.开个玩笑罢了, 递归 是一种编程技巧,它可以让函数在不使用 for 或 while 的情况下,使用一个调用自身的函数来实现循环. 例子 1:整数总和 例如,假设我们想要 ...

  2. JavaScript简餐——函数尾调用优化

    文章目录 前言 一.认识尾调用优化 二.尾调用优化的条件 三.尾调用优化实例 总结 前言 写本<JavaScript简餐>系列文章的目的是记录在阅读学习<JavaScript高级程序 ...

  3. [js] 举例说明js中什么是尾调用优化

    [js] 举例说明js中什么是尾调用优化 写在前面 上次介绍了什么是尾调用以及怎么准确快速的判别一个函数调用是否为尾调用.那么,我们判别尾调用的意义是什么呢?做什么事情总归有个目的,那么今天我们就来系 ...

  4. 尾调用优化 java_基于Java8函数式编程求一个List的全部子集|尾调用优化解决递归性能问题...

    目录 基于函数式编程求一个List的全部子集 代码来自<Java8 in Action>,思路和其他递归解决方法一致,但不同的地方在concat方法 public static List& ...

  5. 什么是尾调用优化和尾递归?

    尾调用:某个函数的最后一步是调用另一个函数. 尾递归:如果尾调用自身,则是尾递归. 尾调用优化: 函数调用会在内存中形成一个"调用记录",又称为"调用帧",保存 ...

  6. java调用javascript函数_[Java教程]JavaScript函数的4种调用方法详解

    [Java教程]JavaScript函数的4种调用方法详解 0 2016-08-09 00:00:12 在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而非像C# ...

  7. JavaScript函数调用方式:简单调用+在超链接中调用JavaScript函数+在事件中调用JavaScript函数

    简单的调用 <html> <head> <meta http-equiv="Content-Type" content="text/html ...

  8. JavaScript函数的声明以及调用(1)

    1.为什么需要函数 2.函数的声明和调用和java和c#差不多,复习java和C#笔记即可 3.函数形参实参匹配问题 4.return return后面的代码不会继续执行,所以说return不仅可以返 ...

  9. 尾调用优化 java_为什么JVM仍然不支持尾调用优化?

    拉丁的传说 也许您已经知道这一点,但是这个功能并不像听起来那么简单,因为Java语言实际上将堆栈跟踪暴露给程序员.考虑以下程序:public class Test { public static St ...

最新文章

  1. Leangoo看板协作工具“免费版”和“企业版”差异
  2. metaSPAdes:新型多功能宏基因组拼接工具
  3. docker 在容器外执行某个容器内的某个命令
  4. Python(1):写在前面
  5. python画交互式地图_使用Python构建交互式地图-入门指南
  6. 有了MDL锁视图,业务死锁从此一目了然
  7. 微软自带的FTP设置帐号
  8. python水仙花数判断程序
  9. 基于Django框架的物联网空气质量监测系统的实现
  10. activitimq集群搭建_activemq集群的搭建
  11. 【JZOJ】 【NOIP2014】【模拟试题】保镖排队
  12. 10^5以下素数筛法——素数表法
  13. 帮你解剖Python的一个轻量级桌面GUI开发第三方库:Eel,让它体无完肤
  14. JVM之运行时数据区(方法区)
  15. (FAQ)VM log是做什么的,4 Way VM又是什么
  16. 冷战时期_从冷战到深度学习的机器翻译历史
  17. 云计算系统测试技术基础
  18. access 数据修复记
  19. igh ethercat主站文档(中文翻译下)
  20. android editable接口,Spannable与Editable区别

热门文章

  1. android tag的使用方法,Android:如何使用Html.TagHandler?
  2. mysql 查询分析器中使用if_查询分析器中开发代码测试检查_MySQL
  3. 代码统计工具有哪几种_跟我学“Linux”小程序Web版开发(四):引入统计及Crash收集...
  4. python可以做运动控制卡吗_今天,终于明白了运动控制器和运动控制卡的区别
  5. java基础知识一_Java基础知识(一)
  6. JavaScript异步
  7. JRE System Library和 Referenced Libraries 的区别和来源
  8. 用“Web的思想”做PC客户端
  9. 复习--SQL Server (一) -系统数据库
  10. 萨蒂扬软件技术(南京)研发中心”落户高新区