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 相关文章推荐
javascript函数库-集合框架
Apr 27 Javascript
JQuery Tips(4) 一些关于提高JQuery性能的Tips
Dec 19 Javascript
JavaScript中出现乱码的处理心得
Dec 24 Javascript
javascript 二进制运算技巧解析
Nov 27 Javascript
img onload事件绑定各浏览器均可执行
Dec 19 Javascript
Underscore.js 的模板功能介绍与应用
Dec 24 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
Mar 04 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
Aug 04 Javascript
ionic实现滑动的三种方式
Aug 27 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
Feb 07 Javascript
vue 2.0组件与v-model详解
Mar 27 Javascript
js canvas实现星空连线背景特效
Nov 01 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
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
JavaScript入门教程 Cookies
2009/01/31 Javascript
jquery 简单导航实现代码
2009/09/11 Javascript
学习ExtJS(一) 之基础前提
2009/10/07 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
理解JavaScript中worker事件api
2015/12/25 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
javascript正则表达式之分组概念与用法实例
2016/06/16 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
VUE 组件转换为微信小程序组件的方法
2019/11/06 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
2020/03/08 Javascript
[04:40]DOTA2-DPC中国联赛1月26日Recap集锦
2021/03/11 DOTA
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
python+mysql实现学生信息查询系统
2019/02/21 Python
详解Python传入参数的几种方法
2019/05/16 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
STP的判定过程
2012/10/01 面试题
大学生护理专业自荐信
2013/10/03 职场文书
小学教师师德师风个人整改措施
2014/09/18 职场文书
当幸福来敲门观后感
2015/06/01 职场文书
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers
vue实现登陆页面开发实践
2022/05/30 Vue.js