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 相关文章推荐
EditPlus注册码生成器(js代码实现)
Mar 25 Javascript
jQuery中setTimeout的几种使用方法小结
Apr 07 Javascript
js自动查找select下拉的菜单并选择(示例代码)
Feb 26 Javascript
javascript制作的网页侧边弹出框思路及实现代码
May 21 Javascript
JS常用表单验证方法总结
May 22 Javascript
jquery操作checked属性以及disabled属性的多种方法
Jun 20 Javascript
AJAX实现瀑布流触发分页与分页触发瀑布流的方法
May 23 Javascript
JS实现隔行换色的表格排序
Mar 27 Javascript
详解如何使用koa实现socket.io官网的例子
Nov 04 Javascript
解决layer.open弹出框不能获取input框的值为空的问题
Sep 10 Javascript
vue远程加载sfc组件思路详解
Dec 25 Javascript
Vue3 的响应式和以前有什么区别,Proxy 无敌?
May 20 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
图书管理程序(一)
2006/10/09 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
Nodejs学习笔记之Stream模块
2015/01/13 NodeJs
JavaScript获取页面中表单(form)数量的方法
2015/04/03 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
javascript拖拽应用实例(二)
2016/03/25 Javascript
JavaScript获取键盘按键的键码(参照表)
2017/01/10 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
微信小程序版本自动更新的方法
2019/06/14 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
2020/08/10 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
python如何统计序列中元素
2020/07/31 Python
python交易记录链的实现过程详解
2019/07/03 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
python 循环数据赋值实例
2019/12/02 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
python批量生成身份证号到Excel的两种方法实例
2021/01/14 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
html5 canvas-2.用canvas制作一个猜字母的小游戏
2013/01/07 HTML / CSS
《植物妈妈有办法》教学反思
2014/02/25 职场文书
幼儿评语大全
2014/04/30 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
消夏晚会主持词
2015/06/30 职场文书
vue使用watch监听属性变化
2022/04/30 Vue.js
鸿蒙3.0体验感怎么样? 鸿蒙3.0系统评测向
2022/08/14 数码科技