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 相关文章推荐
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
Sep 22 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
Feb 16 Javascript
jquery下div 的resize事件示例代码
Mar 09 Javascript
from表单多个按钮提交用onclick跳转不同action
Apr 24 Javascript
动态读取JSON解析键值对的方法
Jun 03 Javascript
Javascript 绘制 sin 曲线过程附图
Aug 21 Javascript
javascript学习笔记(六)数据类型和JSON格式
Oct 08 Javascript
bootstrap table实现单击单元格可编辑功能
Mar 28 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
Mar 03 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
May 07 Javascript
详解vue 图片上传功能
Apr 30 Javascript
JS实现简单打字测试
Jun 24 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下mysql数据库操作类(改自discuz)
2010/07/03 PHP
php中json_decode()和json_encode()的使用方法
2012/06/04 PHP
工厂模式在Zend Framework中应用介绍
2012/07/10 PHP
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
使用js Math.random()函数生成n到m间的随机数字
2014/10/09 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
理解javascript中的原型和原型链
2015/07/30 Javascript
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
js实现基于正则表达式的轻量提示插件
2015/08/29 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
什么是Vue.js框架 为什么选择它?
2017/10/17 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
vue的token刷新处理的方法
2018/07/17 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
详解微信小程序自定义组件的实现及数据交互
2019/07/22 Javascript
JavaScript语句错误throw、try及catch实例解析
2020/08/18 Javascript
Python break语句详解
2014/03/11 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
python二维图制作的实例代码
2020/12/03 Python
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
美国名牌香水折扣网站:Hottperfume
2021/02/10 全球购物
初中同学会活动方案
2014/08/22 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
大学生万能检讨书范例
2014/10/04 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
详解python网络进程
2021/06/15 Python
Java多条件判断场景中规则执行器的设计
2021/06/26 Java/Android
Python实现8种常用抽样方法
2021/06/27 Python
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS