ES6尾递归优化的实现
来源:互联网 发布:安卓hd软件 编辑:程序博客网 时间:2024/06/05 16:49
先看一个正常的递归函数。
function sum(x, y) { if (y > 0) { return sum(x + 1, y - 1); } else { return x; }}sum(1, 100000)// Uncaught RangeError: Maximum call stack size exceeded(…)
上面代码中,sum是一个递归函数,参数x是需要累加的值,参数y控制递归次数。一旦指定sum递归100000次,就会报错,提示超出调用栈的最大次数。
可以将递归执行转为循环执行。
function tco(f) { var value; var active = false; var accumulated = []; return function accumulator() { accumulated.push(arguments); if (!active) { active = true; while (accumulated.length) { value = f.apply(this, accumulated.shift()); } active = false; return value; } };}var sum = tco(function(x, y) { if (y > 0) { return sum(x + 1, y - 1) } else { return x }});sum(1, 100000)// 100001
上面代码中,tco函数是尾递归优化的实现,它的奥妙就在于状态变量active。默认情况下,这个变量是不激活的。一旦进入尾递归优化的过程,这个变量就激活了。然后,每一轮递归sum返回的都是undefined,所以就避免了递归执行;而accumulated数组存放每一轮sum执行的参数,总是有值的,这就保证了accumulator函数内部的while循环总是会执行。这样就很巧妙地将“递归”改成了“循环”,而后一轮的参数会取代前一轮的参数,保证了调用栈只有一层。
阅读全文
0 0
- ES6尾递归优化的实现
- 尾递归优化(es6)
- ES6尾递归
- ES6-函数的扩展-尾调用优化
- 对SNL语言的解释器实现尾递归优化
- js递归的优化(尾递归)
- javascript的递归、尾调用和蹦床函数: 各种解决方案的性能对比及Babel和ES6优化([翻译自外网博客]
- 二分查找的非递归、递归实现及其优化
- 递归与尾递归的循环实现
- 递归优化之尾递归
- 递归及尾递归优化
- 递归及尾递归优化
- 递归优化之尾递归
- ES6中class的实现
- 浅谈尾递归的优化方式
- lists优化,尾递归的重要一点
- 快速排序的尾递归优化
- 浅谈尾递归的优化方式
- 默认构造函数和拷贝构造函数
- HTTPS 性能优化技巧
- Java HashTable 以及子类 Properties使用
- spring boot 学习笔记
- 项目线上Bug处理流程
- ES6尾递归优化的实现
- 常用stl
- 开发只懂 AFN ?搞定 NSURLSession 才是硬道理
- Deepin下安装Maven
- Docker安装教程Centos7和Docker基础使用常用命令
- 实验一
- .NoClassDefFoundError
- 【牛客网】相反数
- MySQL半同步复制--handle_slave_io--3