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 实现二级/三级/多级联动菜单的思路及代码
Apr 08 Javascript
js计算两个时间之间天数差的实例代码
Nov 19 Javascript
js post提交调用方法
Feb 12 Javascript
jQuery判断一个元素是否可见的方法
Jun 05 Javascript
AngularJS在IE8的不支持的解决方法
May 13 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
May 20 Javascript
JQuery在循环中绑定事件的问题详解
Jun 02 Javascript
JavaScript新增样式规则(推荐)
Jul 19 Javascript
带你快速理解javascript中的事件模型
Aug 14 Javascript
javascript帧动画(实例讲解)
Sep 02 Javascript
mui back 返回刷新页面的实例
Dec 06 Javascript
design vue 表格开启列排序的操作
Oct 28 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
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
详解laravel安装使用Passport(Api认证)
2018/07/27 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
EXT中xtype的含义分析
2010/01/07 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
JS的Ajax与后端交互数据的实例
2018/08/08 Javascript
js实现多个倒计时并行 js拼团倒计时
2019/02/25 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
在vs code 中如何创建一个自己的 Vue 模板代码
2020/11/10 Javascript
Python标准库与第三方库详解
2014/07/22 Python
对于Python的Django框架部署的一些建议
2015/04/09 Python
python使用pymysql实现操作mysql
2016/09/13 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
python使用正则筛选信用卡
2019/01/27 Python
python实现两张图片的像素融合
2019/02/23 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
django之从html页面表单获取输入的数据实例
2020/03/16 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
优秀研究生自我鉴定
2013/12/04 职场文书
厨师长岗位职责
2014/03/02 职场文书
2014年个人教学工作总结
2014/12/09 职场文书
管辖权异议上诉状
2015/05/23 职场文书
应届毕业生的自我评价
2019/06/21 职场文书
Python基础详解之邮件处理
2021/04/28 Python
聊一聊python常用的编程模块
2021/05/14 Python
详解Redis主从复制实践
2021/05/19 Redis
Java Socket实现多人聊天系统
2021/07/15 Java/Android