尾调用:某个函数的最后一步是调用另一个函数。
尾递归:如果尾调用自身,则是尾递归。

尾调用优化:
函数调用会在内存中形成一个“调用记录”,又称为“调用帧”,保存调用位置和内部变量信息。当函数嵌套的层级比较深,调用栈中的调用帧比较多,对内存的消耗很大。浏览器的调用栈的大小都有限制。
尾调用是函数的最后一步,所以不需要,保留外层函数的调用记录,因为调用位置、内部变量的信息不会再用到,可以直接用内层函数的调用记录,取代外层函数的调用记录。可以删除外层无用的调用帧,来节约浏览器的内存。

如何查看调用栈,
1.console.trace
2.debugger (Call Stack) (Local 局部变量)(Global 全局变量)

案例
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

解法:最后一步可以选择爬1个或2个台阶,则爬n阶等于爬(n-1)+(n-2)个台阶之和。当n=1,2;有1,2种方法;
用递归的方式

function f(n:number):number{if(n===1){return 1;}if(n===2){return 2}return f(n-1)+f(n-2)
}

但递归求解,当n很大时,会出现超时和调用堆栈溢出问题,则可以用尾递归进行优化,如下:

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

每次的结果都保留在参数中,只保留一个调用记录,复杂度 O(1),不需要保留每一步的调用记录

什么是尾调用优化和尾递归?相关推荐

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

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

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

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

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

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

  4. javascript --- 函数的优化(尾调用优化)

    从一个熟悉的Fibonacci数列的实现开始: function Fibonacci (n) {if ( n <= 1) { return 1};return Fibonacci(n -1) + ...

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

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

  6. ES6 尾调用和尾递归优化

    尾调用 尾调用(Tail Call)是函数式编程的一个重要概念,就是指某个函数的最后一步是调用另一个函数. function fun(x){return a(x); } 上面代码中,函数fun的最后一 ...

  7. ondestroy什么时候调用_尾调用和尾递归

    尾调用 1. 定义 尾调用是函数式编程中一个很重要的概念,当一个函数执行时的最后一个步骤是返回另一个函数的调用,这就叫做尾调用. 注意这里函数的调用方式是无所谓的,以下方式均可: 函数调用: func ...

  8. 【恋上数据结构】递归(函数调用过程、斐波那契数列、上楼梯、汉诺塔、递归转非递归、尾调用)

    递归(Recursion) 什么是递归? 函数的调用过程(栈空间) 函数的递归调用过程 递归实例分析(1 + 2 + 3 + ... + 100 的和) 递归的基本思想.使用套路 斐波那契数列 fib ...

  9. 【算法】递归:递归优化之尾递归

    [算法]递归:递归优化之尾递归 引言:在以往我发过一篇过于通过分析法去理解递归求解递归的博客文章,那篇文章主要介绍了如何去求解递归问题.而在这篇文章中,我会介绍一下如何去优化递归,顺带还会去分析一下递 ...

最新文章

  1. 【错误记录】Android Studio 编译报错 ( Invalid main APK outputs : EarlySyncBuildOutput )
  2. 检测某个IP是否属于某个网段范围
  3. python学习笔记--随时更新
  4. “约见”面试官系列之常见面试题第十七篇之实现深拷贝(建议收藏)
  5. java中的过滤器与监听器
  6. 《计算机操作系统》思维导图
  7. C语言面试题 - static的使用
  8. WLAN与WiFi各是什么意思有什么区别
  9. VMware Workstation报错:cpu-0:VERIFY vmcore/vmm/main/cpuid.c:386 bugNr=1036521
  10. 万能密码或账号登录语句
  11. Lenovo k860i 移植Android 4.4 cm11进度记录【下篇--实时更新中】
  12. 经典linux c程序,经典 c 程序 100 例
  13. antd vue table ellipsis属性不生效
  14. 木材加工(LintCode)
  15. Hive正则表达式案例
  16. linux编程性能,Linux性能评估工具
  17. 单机java_java实现单机版五子棋小游戏
  18. Foundation Actionscript 3.0 with Flash CS3 and Flex
  19. 2017华为比赛遗传算法总结
  20. 华为U8220 fastboot刷机

热门文章

  1. 我是如何防止老公变成渣男的
  2. java实验指导书答案_(Java实验指导书答案2.doc
  3. 信息化消防应急指挥调度如何实现高效救援?
  4. iTab!一款超级无敌好用的浏览器插件 简洁美观
  5. PostgreSQL 常用命令 总结 ||数据库导入导出
  6. Python 实现高德地图找房
  7. 多标签分类的学习感悟
  8. 11万字政务云数字化平台建设方案(word)
  9. Linux系统内存占用过高排查方法
  10. 东方联盟为何那么团结?郭盛华是怎样做到的?