JS中的递归

我们来看一个阶乘的代码

function foo( n ){if(n <= 1){return 1;}return n * foo( n - 1 );
}foo(5);  // 120

下面分析一下,代码运行过程中,执行上下文栈是怎么变化的

  1. 这个代码是在全局作用域中执行的,所以在foo函数得到执行之前,上下文栈中就已经被放入了一个全局上下文。之后执行一个函数,生成一个新的执行上下文时,JS引擎都会将新的上下文push到该栈中。如果函数执行完成,JS引擎会将对应的上下文上下文栈中弹出

  2. 一开始执行foo函数的时候,JS引擎会创建foo的执行上下文,将该执行上下文push进上下文栈。然后开始执行foo中的代码。

现在上下文栈中已经有了两个执行上下文了

  1. 在执行到foo中代码快结束时,return表达式中,又调用了foo函数。所以又会创建一个新的执行上下文。并且JS引擎会把这新的执行上下文push到上下文栈中。

现在上下文栈中已经有了三个执行上下文了

  1. 开始重复第3步的执行。一直到n<=1,才不会有新的执行上下文产生。

此刻上下文栈中,已经有了6个上下文了(包含了全局上下文)

设想一下

  1. 如果刚开始调用的时候,传入n的初始值为100,到n<=1时,上下文栈中会有几个上下文。101个。
  2. 如果初始值为1000呢?到n<=1时,会有1001个执行上下文
  3. 也就是说,传入的初始值越大,执行上下文栈中,就会有越多的执行上下文

    javascript尾递归优化相关推荐

    1. javascript --- 尾递归优化的实现

      考虑一个正常的递归函数 function sum(x, y) {if (y > 0) {return sum (x + 1, y - 1);} else {return x;} } sum(1, ...

    2. Kotlin尾递归优化

      一.尾递归优化 1.递归的一种特殊形式 2.调用自身后无其他的操作 3.tailrec关键字提示编译器尾递归优化 二.具体的来看看一下代码说明 package net.println.kotlin.c ...

    3. JavaScript开发优化技巧

      JavaScript开发优化技巧 1.按字符串属性值对对象数组进行排序 可以通过不同的方式来完成. 1).使用Underscore _.sortBy(collection, [iteratees=[_ ...

    4. python 函数式编程尾递归优化 day16

      函数编程的特征: 1不可变:不用变量保存状态,不修改变量 #非函数式 a = 1 def incr_test1():global a#一旦更改全局变量后后面再调用a就容易乱a += 1return a ...

    5. 请求时才延迟加载JavaScript文件 - 优化篇

      技术关键词 · 收集: 阻塞浏览器.并行下载.竞态条件.关联函数(关联JavaScript代码).非阻塞请求.动态创建<script>标签.异步下载.延时加载 代码实例: 下面我们先看一段 ...

    6. 尾递归优化原理与Python实现(以Fibonacci数列和小明爬楼梯问题为例)

      首先祝全体屋友中秋节快乐! 众所周知,在函数递归调用时,要保存函数调用的位置以便使得被调函数结束后能够返回正确的位置,这个信息保存在线程栈中.由于栈的空间有限,所以如果函数递归调用深度超过一定限制,会 ...

    7. 尾递归优化 - 尾递归优化

      原理 调用一个函数时,就会形成一个调用帧:在A函数内部执行B函数:当调用A函数时形成一个A的调用帧,在A函数内部调用B函数,在A调用帧上又会生成B调用帧,B执行完毕时B调用帧消失,A完毕后A调用帧消失 ...

    8. python递归_Python开启尾递归优化!

      Python尾递归优化 一般递归与尾递归 一般递归: def normal_recursion(n): if n == 1: return 1 else: return n + normal_recu ...

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

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

    最新文章

    1. junit5 与 surefire 对接使用
    2. python执行gradle脚本
    3. java poi 设置标题_poi生成Word时指定文本样式,如“正文”,“标题1”,“标题2”等...
    4. Node中使用token(基于第三方包jsonwebtoken)
    5. 云原生实时数仓首次在2020双11核心数据场景落地
    6. DFINITY创始人:目前仍以Q1路线图为主要目标,正在进行创世启动前的安全审计
    7. Log4j2 - java.lang.NoSuchMethodError: com.lmax.disruptor.dsl.Disruptor
    8. redis常见问题和解决方案
    9. jar命令 解压/压缩 war、jar文件
    10. ajax中返回sucess里使用this.$message()
    11. 编写MTK6737平台的GPIO驱动例程(六)
    12. 石油大学个人训练赛(一)补题----问题 A: 斗地主
    13. 5-10 计算存款利息 (10分)
    14. gitLab数据备份和迁移
    15. Esper学习之十:EPL语法(六)
    16. mysql5.7.23绿色版安装
    17. 华为最新全面屏手机鸿蒙系统,华为P50pro最新确认:麒麟1020+立体全面屏+鸿蒙系统,这才是华为...
    18. 网页版 linux终端,网页版的Linux-大神之笔
    19. OJ每日一练——求平均年龄
    20. EasyRecovery适用于Windows和Mac的专业数据恢复软件

    热门文章

    1. 怎么把php转变成word文档,表格怎么转换成word文档
    2. Java项目:SSM在线工艺品销售商城平台网站
    3. 计算机网络的基,计算机网络基.doc
    4. Power Designer:正向构建数据库数据库逆向工程SQL生成数据库报表
    5. 计算机常识细节整理(一)时间复杂度和空间复杂度
    6. 扶摇安全实验室|研究性学习渗透测试报告
    7. PDF2Word v1.40 汉化版
    8. 优化算法:人工蜂鸟算法AHA
    9. Linux防火墙操作firewall、iptable
    10. android砖刷机精灵,Android刷机精灵:喜刷刷