es6函数之尾递归用法实例分析


Posted in Javascript onApril 25, 2020

本文实例讲述了es6函数之尾递归用法。分享给大家供大家参考,具体如下:

函数调用自身,称为递归,如果尾调用自身,就称为尾递归。

递归非常耗费内存。因为需要同时保存成千上百个调用帧,很容易发生“栈溢出”错误(stack overflow)。但是对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。

function factorial(n) {
 if (n === 1) return 1
 return n * factorial(n - 1)
}

如果改成尾递归,只保留一个调用记录,复杂度O(1)

function factorial(n, total = 1) {
if (n === 1) return total
return factorial(n - 1, n * total)
}

factorial(5)

非尾递归的 Fibonacci 数列实现如下。

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

 return Fibonacci(n - 1) + Fibonacci(n - 2);
}

Fibonacci(10) // 89
Fibonacci(100) // 堆栈溢出
Fibonacci(500) // 堆栈溢出

尾递归优化过的 Fibonacci 数

列实现如下。

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

 return Fibonacci2 (n - 1, ac2, ac1 + ac2);
}

Fibonacci2(100) // 573147844013817200000
Fibonacci2(1000) // 7.0330367711422765e+208
Fibonacci2(10000) // Infinity

尾递归的实现,往往需要改写递归函数,确保最后一步只调用自身。做到这一点的方法,就是把所有用到的内部变量改写成函数的参数。

函数式编程有一个概念,叫做柯里化(currying),意思是将多参数的函数转换成单参数的形式。这里可以使用柯里化。

function currying(fn, n) {
return function(m) {
return fn.call(this, m, n)
}
}

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript中的变量是传值还是传址的?
Apr 19 Javascript
删除javascript中注释语句的正则表达式
Jun 11 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
Mar 03 Javascript
详解JavaScript中的客户端消息框架设计原理
Jun 24 Javascript
js CSS3实现卡牌旋转切换效果
Jul 04 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
Oct 31 Javascript
es6在react中的应用代码解析
Nov 08 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
Nov 18 Javascript
vue中使用better-scroll实现滑动效果及注意事项
Nov 15 Javascript
vue-router启用history模式下的开发及非根目录部署方法
Dec 23 Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
Jun 26 Javascript
如何用JS模拟实现数组的map方法
Jul 30 Javascript
javascript 易错知识点实例小结
Apr 25 #Javascript
javascript执行上下文、变量对象实例分析
Apr 25 #Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
Apr 25 #Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
Apr 25 #Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
Apr 25 #Javascript
javascript 函数的暂停和恢复实例详解
Apr 25 #Javascript
详解ES6 CLASS在微信小程序中的应用实例
Apr 24 #Javascript
You might like
蝙蝠侠:侠影之谜
2020/03/04 欧美动漫
不用数据库的多用户文件自由上传投票系统(3)
2006/10/09 PHP
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
基于PHP文件操作的详细诠释
2013/06/21 PHP
php数组去重复数据示例
2014/02/25 PHP
PHP实现的curl批量请求操作示例
2018/06/06 PHP
使用PHP开发留言板功能
2019/11/19 PHP
javascript比较文档位置
2008/04/08 Javascript
使用AOP改善javascript代码
2015/05/01 Javascript
Javascript中this绑定的3种方法与比较
2016/10/13 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
python列表与元组详解实例
2013/11/01 Python
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
pandas计数 value_counts()的使用
2019/06/24 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
python爬虫之遍历单个域名
2019/11/20 Python
python队列原理及实现方法示例
2019/11/27 Python
python将时分秒转换成秒的实例
2019/12/07 Python
深入浅析python的第三方库pandas
2020/02/13 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
如何查看python关键字
2021/01/17 Python
Django中template for如何使用方法
2021/01/31 Python
Html5定位终极解决方案
2020/02/05 HTML / CSS
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
新学期教师寄语
2014/04/02 职场文书
部门年终奖分配方案
2014/05/07 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
模特大赛策划方案
2014/05/28 职场文书
个人收入证明模板
2014/09/18 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
污水处理保证书
2015/05/09 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
学会Python数据可视化必须尝试这7个库
2021/06/16 Python
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis
Win11无法访问设备和打印机 如何解决页面空白
2022/04/09 数码科技