当前位置: 首页 > news >正文

函数尾调用优化

尾调用

在编码过程中,经常涉及到函数调用函数,例如:

function a() {b();
}function b() {}

我们每次调用函数,都会在在内存中记录一个“调用帧”又成为“栈帧空间”
在上述例子中,调用a()函数,会在内存中记录一个调用栈,然后继续调用b()函数,此时在内存中又会记录一个调用帧,等到b()函数运行结束,调用帧a、b的内存才会释放。
我们可以利用“尾调用”来释放调用帧内存

function a() {return b();
}function b() {}

上述代码中,在函数的最后一步调用了b()函数,外层函数内存直接被释放,确认代之的是b()函数内存被创建,从复杂度来看,普通调用复杂度O(n),尾调用复杂度O(1)

尾调用并不是函数中的最后一行,而是最后一步,在下面的例子中,也可以实现尾调用

function a(n) {if(n === 5){return b();  // 尾调用}return c(); // 尾调用
}

尾递归

递归函数就是函数调用自身,正常的递归函数会进行深层调用,每次调用函数都会创建内存,也就是上面所说的调用帧,直到递归函数执行完毕,内存才会被释放,如果递归函数层级过深,记录栈帧过多,会导致栈溢出错误。
我们可以利用尾调用来优化并释放内存,下面是一个尾递归函数

/* 尾递归 */
function tailRecur(n, res) {// 终止条件if (n === 0) return res;// 尾递归调用return tailRecur(n - 1, res + n);
}

相关文章:

  • 面试官:对于MQ中的消息丢失你是如何理解的?
  • OpenAI助手API接入-问答对自动生成
  • 江苏大信环境科技有限公司:环保领域的开拓者与引领者
  • Anaconda中的常用科学计算工具
  • The Best Toolkit 最好用的工具集
  • 安装LLVM后无法使用FileCheck工具
  • 城市之旅:使用 LLM 和 Elasticsearch 简化地理空间搜索(一)
  • 【微服务】部署mysql集群,主从复制,读写分离
  • 地图编辑功能的使用场景
  • 智能工厂生产设备实时监控技术的UI设计
  • Go 语言的控制结构:条件与循环
  • 详解 Spark SQL 代码开发之用户自定义函数
  • Flink状态State | 大数据技术
  • elementUI - 折叠以及多选的组件
  • Java1.8+ idea hbuilder+ uniapp、vue上门家政小程序APP源码开发
  • [译]CSS 居中(Center)方法大合集
  • Docker 笔记(2):Dockerfile
  • golang 发送GET和POST示例
  • interface和setter,getter
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Less 日常用法
  • Python连接Oracle
  • spring boot 整合mybatis 无法输出sql的问题
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 复习Javascript专题(四):js中的深浅拷贝
  • 记录:CentOS7.2配置LNMP环境记录
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 马上搞懂 GeoJSON
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • ionic入门之数据绑定显示-1
  • MPAndroidChart 教程:Y轴 YAxis
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​马来语翻译中文去哪比较好?
  • ​如何防止网络攻击?
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (1)Jupyter Notebook 下载及安装
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (笔试题)合法字符串
  • (二)springcloud实战之config配置中心
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (七)Flink Watermark
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (一)Neo4j下载安装以及初次使用
  • (转)fock函数详解
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .NET 回调、接口回调、 委托
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET面试题(二)
  • .NET实现之(自动更新)