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数组处理代码详解(含实例演示)
Feb 03 Javascript
jquery等宽输出文字插件使用介绍
Sep 18 Javascript
点击标签切换和自动切换DIV选项卡
Aug 10 Javascript
实例详解AngularJS实现无限级联动菜单
Jan 15 Javascript
js弹性势能动画之抛物线运动实例详解
Jul 27 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
Sep 29 Javascript
JS数组求和的常用方法总结【5种方法】
Jan 14 Javascript
微信小程序自定义tabBar在uni-app的适配详解
Sep 30 Javascript
vue实现配置全局访问路径头(axios)
Nov 01 Javascript
Bootstrap table 服务器端分页功能实现方法示例
Jun 01 Javascript
原生JS封装vue Tab切换效果
Apr 28 Vue.js
HTML+VUE分页实现炫酷物联网大屏功能
May 27 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&amp;&amp;mysql)二
2006/10/09 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
PHP测试成功的邮件发送案例
2015/10/26 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
来自qq的javascript面试题
2010/07/24 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
详解vue事件对象、冒泡、阻止默认行为
2017/03/20 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
深入了解js原型模式
2019/05/30 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
Django发送html邮件的方法
2015/05/26 Python
python中利用xml.dom模块解析xml的方法教程
2017/05/24 Python
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
python实现数据写入excel表格
2018/03/25 Python
在Python中使用gRPC的方法示例
2018/08/08 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
Python 2.6.6升级到Python2.7.15的详细步骤
2020/12/14 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
Nike意大利官网:Nike.com IT
2020/01/19 全球购物
不用游标的SQL语句有哪些
2012/09/07 面试题
为什么Runtime.exec(“ls”)没有任何输出?
2014/10/03 面试题
体育教育专业毕业生自荐信
2013/11/15 职场文书
承诺书格式范文
2014/06/03 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
2014年工作总结及2015工作计划
2014/12/12 职场文书
骆驼祥子读书笔记
2015/06/26 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python