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 相关文章推荐
splice slice区别
Oct 09 Javascript
基于jQuery捕获超链接事件进行局部刷新代码
May 10 Javascript
Jquery实现自定义tooltip示例代码
Feb 12 Javascript
从零学jquery之如何使用回调函数
May 16 Javascript
jquery判断iPhone、Android设备类型
Sep 14 Javascript
学习JavaScript图片预加载模块
Nov 07 Javascript
jQuery为某个div加入行样式
Jun 09 jQuery
JavaScript字符串检索字符的方法
Jun 23 Javascript
angular5 子组件监听父组件传入值的变化方法
Sep 30 Javascript
原生JS实现留言板
Mar 26 Javascript
flexible.js实现移动端rem适配方案
Apr 07 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
Jul 31 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根据某字段对多维数组进行排序的方法
2015/03/07 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
thinkphp5引入公共部分header、footer的方法详解
2018/09/14 PHP
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
BootStrap文件上传样式超好看【持续更新】
2016/05/10 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
微信小程序 教程之注册页面
2016/10/17 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
微信小程序中页面FOR循环和嵌套循环
2017/06/21 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
Python实现Linux下守护进程的编写方法
2014/08/22 Python
Python算法之图的遍历
2017/11/16 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
tensorflow指定GPU与动态分配GPU memory设置
2020/02/03 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
css3 pointer-events 介绍详解
2017/09/18 HTML / CSS
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
中专生毕业自我鉴定
2013/11/01 职场文书
开业主持词
2014/03/21 职场文书
高三学生评语大全
2014/04/25 职场文书
安全生产计划书
2014/05/04 职场文书
2016年元旦主持词
2015/07/06 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
关于CSS浮动与取消浮动的问题
2021/06/28 HTML / CSS
JavaScript流程控制(分支)
2021/12/06 Javascript