可以调用多少次递归?

时间:2016-08-21 05:38:01

标签: javascript recursion

我想使用递归来计算从1到100000的总和,但是当我运行以下代码时,浏览器抛出一个异常(Uncaught RangeError:超出最大调用堆栈大小)。

function sum(num){
  if(num > 0){
    num +=arguments.callee(num-1);
  }
  return num;
};
sum(100000);
然后,我使用以下函数来计算可以使用的次数 递归。

    function computeMaxCallStackSize() {
    try {
        return 1 + computeMaxCallStackSize();
    } catch (e) {
        // Call stack overflow
        return 1;
    }
};computeMaxCallStackSize();//output:15624
所以,当我使用递归计算超过15624次时,我该怎么办?

1 个答案:

答案 0 :(得分:1)

你的递归太多了。这是浏览器特定的,不仅是堆栈大小,还有优化,如尾递归优化和东西。我想这里唯一可靠的事情就是以不会将大量内容放入堆栈的方式编写代码,或者手动测试(深入阅读文档)每个浏览器。毕竟,当您看到“太多递归”错误或类似错误时,您已经知道代码存在问题。

以下是您可以采取的措施,以避免过多的递归:

  • 使用迭代而不是递归;
  • 使用Memoization;
  • 使用SetTimeOut