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的函数、创建对象、封装、属性和方法、继承
Mar 10 Javascript
EasyUI中的tree用法介绍
Nov 01 Javascript
jquerymobile局部渲染的各种刷新方法小结
Mar 05 Javascript
IE6 hack for js 集锦
Sep 23 Javascript
jQuery中 attr() 方法使用小结
May 03 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
May 17 Javascript
JavaScript页面实时显示当前时间实例代码
Oct 23 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
Apr 10 Javascript
js事件on动态绑定数据,绑定多个事件的方法
Sep 15 Javascript
微信小程序如何获取用户收货地址
Nov 27 Javascript
Electron vue的使用教程图文详解
Jul 05 Javascript
vue添加自定义右键菜单的完整实例
Dec 08 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 cookie名使用点号(句号)会被转换
2014/10/23 PHP
php中JSON的使用方法
2015/04/30 PHP
js 替换
2008/02/19 Javascript
jquery isType() 类型判断代码
2011/02/14 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
js实现简单锁屏功能实例
2015/05/27 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
详解nodeJS之路径PATH模块
2017/05/31 NodeJs
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
JS跳转手机站url的若干注意事项
2017/10/18 Javascript
详解webpack打包第三方类库的正确姿势
2018/10/20 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
2019/09/12 Javascript
vue cli3适配所有端方案的实现
2020/04/13 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
vue 导出文件,携带请求头token操作
2020/09/10 Javascript
[02:48]DOTA2英雄基础教程 暗夜魔王
2013/12/12 DOTA
Python 初始化多维数组代码
2008/09/06 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
Python基于pillow判断图片完整性的方法
2016/09/18 Python
python版简单工厂模式
2017/10/16 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
Python中正则表达式的用法总结
2019/02/22 Python
TensorFlow 多元函数的极值实例
2020/02/10 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
GAP美国官网:美国休闲时尚品牌
2016/08/26 全球购物
世界上最大的网络主机公司:1&1
2016/10/12 全球购物
创业计划书中包含的9个方面
2013/12/26 职场文书
网上签名寄语活动留言
2014/01/18 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
2015年小学教科研工作总结
2015/07/20 职场文书
Java 死锁解决方案
2022/05/11 Java/Android