关于尾递归,我哪里写错了,为什么输入大时还是会报栈溢出?

如题,我用递归计算PI的近似值:PI/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 + ···;
代码如下:

let calPI = (n, sum = 1)=> {
    if(n < 3) 
        return sum*4;    
    n%4 === 1 ? sum += 1/n : sum -= 1/n;
    return calPI(n-2, sum);
}
console.log(calPI(99999));

calPI(9999)没有报栈溢出,请问我是哪里写错了吗?

阅读 2.2k
2 个回答

到目前(2018年7月3日)为止,javascript 引擎除 Safari 浏览器外,其他主流浏览器,如谷歌(包括 v8、node.js)、火狐均未实现 TCO(Tail call optimization)。

你可以使用其他实现了 TCO 的语言来测试算法,例如 C 语言。

参考资料

  1. Tail call optimization in ECMAScript 6, http://2ality.com/2015/06/tai...
  2. es6, https://kangax.github.io/comp...

V8曾经有尾递归优化,但现在已经删掉了
因为尾递归优化会破坏函数的调用栈信息

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