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 相关文章推荐
JS中剪贴板兼容性、判断复制成功或失败
Mar 09 Javascript
javascript字典探测用户名工具
Oct 05 Javascript
function, new function, new Function之间的区别
Mar 08 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
Dec 20 Javascript
javascript弹性运动效果简单实现方法
Jan 08 Javascript
原生js实现无缝轮播图效果
Jan 11 Javascript
javascript 正则表达式去空行方法
Jan 24 Javascript
jquery对象与DOM对象转化
Feb 08 Javascript
requirejs按需加载angularjs文件实例
Jun 08 Javascript
深入浅析ng-bootstrap 组件集中 tabset 组件的实现分析
Jul 19 Javascript
Vue学习之组件用法实例详解
Jan 06 Javascript
微信小程序canvas开发水果老虎机的思路详解
Feb 07 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
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
php结合web uploader插件实现分片上传文件
2016/05/10 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
理解JavaScript的prototype属性
2012/02/11 Javascript
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
JavaScript 布尔操作符解析  &amp;&amp; || !
2012/08/10 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
js动态给table添加/删除tr的方法
2013/08/02 Javascript
原生javaScript做得动态表格(注释写的很清楚)
2013/12/29 Javascript
Nodejs sublime text 3安装与配置
2014/06/19 NodeJs
javascript 数组操作详解
2015/01/29 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
Angularjs 1.3 中的$parse实例代码
2017/09/14 Javascript
webstorm添加*.vue文件支持
2018/05/08 Javascript
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
JavaScript this绑定过程深入详解
2018/12/07 Javascript
[01:32:10]NAVI vs VG Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
Python实现变量数值交换及判断数组是否含有某个元素的方法
2017/09/18 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
美国在线家装零售商:Build.com
2016/09/02 全球购物
英国美术用品购物网站:Cass Art
2019/10/08 全球购物
异常和异常类的概念
2014/09/12 面试题
Java平台和其他软件平台有什么不同
2015/06/05 面试题
幼师专业毕业生自荐信
2013/09/29 职场文书
辞职信怎么写
2015/02/27 职场文书
茶花女读书笔记
2015/06/29 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书
Python实现归一化算法详情
2022/03/18 Python