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 相关文章推荐
jquery.validate使用攻略 第五步 正则验证
Jul 01 Javascript
Javascript绝句欣赏 一些经典的js代码
Feb 22 Javascript
js简单抽奖代码
Jan 16 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
Dec 18 Javascript
理解javascript中Map代替循环
Feb 26 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
Apr 26 Javascript
js实现日历的简单算法
Jan 24 Javascript
详解webpack+vue-cli项目打包技巧
Jun 17 Javascript
ES6解构赋值的功能与用途实例分析
Oct 31 Javascript
基于JavaScript伪随机正态分布代码实例
Nov 07 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
Feb 06 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
Sep 11 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 IP及IP段进行访问限制的代码
2008/12/17 PHP
php保存信息到当前Session的方法
2015/03/16 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
制作个性化的WordPress登陆界面的实例教程
2016/05/21 PHP
PHP实现小偷程序实例
2016/10/31 PHP
删除PHP数组中的重复元素的实现代码
2017/04/10 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
JavaScript 语法集锦 脚本之家基础推荐
2009/11/15 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
史上最为详细的javascript继承(推荐)
2019/05/18 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
Python的print用法示例
2014/02/11 Python
使用Python编写Linux系统守护进程实例
2015/02/03 Python
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
python查看列的唯一值方法
2018/07/17 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
2019/01/08 Python
python dlib人脸识别代码实例
2019/04/04 Python
对Python中画图时候的线类型详解
2019/07/07 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
Python基础之函数原理与应用实例详解
2020/01/03 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
python使用smtplib模块发送邮件
2020/12/17 Python
澳大利亚网上书店:QBD
2021/01/09 全球购物
优秀教师主要事迹
2014/02/01 职场文书
2014年社区植树节活动方案
2014/02/28 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL