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 Array数组对象的扩展函数代码
May 22 Javascript
jquery isType() 类型判断代码
Feb 14 Javascript
JavaScript改变CSS样式的方法汇总
May 07 Javascript
javaScript中slice函数用法实例分析
Jun 08 Javascript
JS实现可展开折叠层的鼠标拖曳效果
Oct 09 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
Jun 10 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
Sep 17 Javascript
JS实现元素上下左右移动效果
Oct 18 Javascript
微信小程序之判断页面滚动方向的示例代码
Aug 30 Javascript
一篇文章弄懂javascript中的执行栈与执行上下文
Aug 09 Javascript
vue实现路由不变的情况下,刷新页面操作示例
Feb 02 Javascript
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
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下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
PHP 错误处理机制
2015/07/06 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
2013/03/11 Javascript
jquery自动切换tabs选项卡的具体实现
2013/12/24 Javascript
js父窗口关闭时子窗口随之关闭完美解决方案
2014/04/29 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
React Native 自定义下拉刷新上拉加载的列表的示例
2018/03/01 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
2020/04/30 jQuery
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
python 中split 和 strip的实例详解
2017/07/12 Python
对python读取CT医学图像的实例详解
2019/01/24 Python
python变量命名的7条建议
2019/07/04 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
革命先烈的英雄事迹材料
2014/02/15 职场文书
副处级干部考察材料
2014/05/17 职场文书
车辆工程专业求职信
2014/06/14 职场文书
客户答谢会活动方案
2014/08/31 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis