关于尾递归优化

刘辉
  • 26

关于尾递归的疑惑

这是一个标准的尾递归

function factorial(n, total) {
  if (n === 1) return total;
  return factorial(n - 1, n * total);
}

这是另一个函数,它的返回值只有sum 和 x 为什么不是尾递归

function sum(x, y) {
  if (y > 0) {
    return sum(x + 1, y - 1);
  } else {
    return x;
  }
}
回复
阅读 1.3k
2 个回答
✓ 已被采纳

你哪里看的?https://baike.baidu.com/item/...
如果你是前端,那么其实知道有这个东西即可,浏览器只有短暂一段时间支持过,后面废弃了,未来估计也很难再支持了

刘辉
  • 26

浏览器并不支持尾函数优化,第一个尾递归也会发生栈溢出
浏览器想使用尾函数优化,想解决栈溢出的问题可以使用蹦床函数或者尾递归优化

function tco(f){
var value;
var active =false;
var accumulated =[];
returnfunction 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

引用 阮一峰 ECMAScript 6 (ES6) 标准入门教程 第三版 尾调用优化

https://www.bookstack.cn/read...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏