递归的真相,请不要相信什么尾递归可以优化递归代码!

发表于 JS 分类,标签:

网上很多人传言,尾递归能优化“栈溢出”,事实真的如此吗?

吃瓜群众,遇到这种事最好的方法就是自己亲自测试一下。

下面是三段递归累加代码对比:


// 普通 递归 

function factorial1(n) {

  if (n === 1) return 1;

  return n + factorial1(n - 1);

}

// 尾递归

function factorial2(n, total) {

  if (n === 1) return total;

  return factorial2(n - 1, n + total);

}

// 函数式传参递归

function factorial13Callback(n,callback){

if (n === 1) return 1;

   return n + callback(n - 1, callback)

}


function factorial13(n, callback) {

  if (n === 1) return 1;

  return n + callback(n - 1, callback);

}



image.png

node  测试,上述截图未node 版本

// 普通递归可以支撑 11399 次数

console.log(factorial1(11399))

console.log(factorial2(10449,1))

console.log(factorial13(10449, factorial13Callback))

// 尾递归 和 函数式传参递归 都只能支撑 10449次数

11399  >  10449

上述代码只要多加一次递归就是报 “栈溢出”

console.log(factorial1(11399))

console.log(factorial2(10449,1))

console.log(factorial13(10449 + 1, factorial13Callback))


image.png


浏览器递归最大支撑,同样,多加1就会“栈溢出”


image.png


0 篇评论

发表我的评论