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 innerHTML使用分析
Dec 03 Javascript
JavaScript实现获得所有兄弟节点的方法
Jul 23 Javascript
jquery带下拉菜单和焦点图代码分享
Aug 24 Javascript
jQuery日历插件datepicker用法详解
Mar 03 Javascript
JS中frameset框架弹出层实例代码
Apr 01 Javascript
JavaScript必知必会(二) null 和undefined
Jun 08 Javascript
webpack3之loader全解析
Oct 26 Javascript
vue中动态设置meta标签和title标签的方法
Jul 11 Javascript
微信小程序数据统计和错误统计的实现方法
Jun 26 Javascript
解决vue admin element noCache设置无效的问题
Nov 12 Javascript
vue之debounce属性被移除及处理详解
Nov 13 Javascript
Vue路由的模块自动化与统一加载实现
Jun 05 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
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
2016/03/22 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
监控 url fragment变化的js代码
2010/04/19 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
Treegrid的动态加载实例代码
2016/04/29 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
vue弹窗组件的实现示例代码
2018/09/10 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
[01:01:41]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第二场 1月31日
2021/03/11 DOTA
python和shell变量互相传递的几种方法
2013/11/20 Python
详细介绍Python函数中的默认参数
2015/03/30 Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
2015/06/17 Python
简述Python中的进程、线程、协程
2016/03/18 Python
利用PyInstaller将python程序.py转为.exe的方法详解
2017/05/03 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
Django模型验证器介绍与源码分析
2020/09/08 Python
俄罗斯玩具、儿童用品、儿童服装和鞋子网上商店:MyToys.ru
2019/10/14 全球购物
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
node中使用shell脚本的方法步骤
2021/03/23 Javascript
竞争上岗演讲稿
2014/01/05 职场文书
工作态度检讨书
2014/02/11 职场文书
元旦晚会主持词
2014/03/24 职场文书
股份转让协议书
2014/04/12 职场文书
司机岗位职责范本
2015/04/10 职场文书
亮剑观后感600字
2015/06/05 职场文书
Python OpenCV实现图像模板匹配详解
2022/04/07 Python