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 相关文章推荐
经典的解除许多网站无法复制文字的绝招
Dec 31 Javascript
JS处理VBArray的函数使用说明
May 11 Javascript
javascript 语法基础 想学习js的朋友可以看看
Dec 16 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
Mar 21 Javascript
JS中操作JSON总结
Dec 06 Javascript
ionic 上拉菜单(ActionSheet)实例代码
Jun 06 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
Sep 24 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
Mar 21 Javascript
JS实现的小火箭发射动画效果示例
Dec 08 Javascript
在Vue环境下利用worker运行interval计时器的步骤
Aug 01 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
Jul 20 Javascript
js和jquery判断数据类型的4种方法总结
Aug 28 jQuery
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
YB217、YB235、YB400浅听
2021/03/02 无线电
使PHP自定义函数返回多个值
2006/11/26 PHP
PHP操作MongoDB GridFS 存储文件的详解
2013/06/20 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
2013/06/27 PHP
国外十大最流行的PHP框架排名
2013/07/04 PHP
PHP生成图片验证码、点击切换实例
2014/06/25 PHP
Codeigniter校验ip地址的方法
2015/03/21 PHP
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
php生成HTML文件的类方法
2019/10/11 PHP
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
2014/01/02 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
微信小程序模拟cookie的实现
2018/06/20 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
2019/01/07 Javascript
Vue动态创建注册component的实例代码
2019/06/14 Javascript
js数组的基本使用总结
2021/01/18 Javascript
Python3中多线程编程的队列运作示例
2015/04/16 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
2016/06/26 Python
详解python中的json的基本使用方法
2016/12/21 Python
对python调用RPC接口的实例详解
2019/01/03 Python
关于初始种子自动选取的区域生长实例(python+opencv)
2020/01/16 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
介绍一下JMS编程步骤
2015/09/22 面试题
中介业务员岗位职责
2014/04/09 职场文书
违纪检讨书范文
2015/01/27 职场文书
2015年评职称工作总结范文
2015/04/20 职场文书
中学推普周活动总结
2015/05/07 职场文书
鉴史问廉观后感
2015/06/10 职场文书
我爱我班主题班会
2015/08/13 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书