JavaScript-超出最大调用堆栈大小

时间:2018-12-21 10:21:44

标签: javascript recursion

我有一个练习要完成,我应该使用递归函数(基本函数)。

我正在使用nodejs以避免在浏览器中使用JS控制台。

当我在这里尝试此功能时:

function factorial(n) {
  if (n === 0) {
    return 0;
  }else {
      return (n * factorial((n-1)*(n-1)));
  }
}

所以当我尝试时:console.log(factorial(0));输出“ 0”。 当我尝试记录任何大于0的数字时,它会显示:

已超过最大调用堆栈大小。

谢谢。

3 个答案:

答案 0 :(得分:0)

这是因为,当您输入factorial((n-1)*(n-1))超过2时,n将返回更多的数字。因此,从那时起,它将是一个无限递归函数调用。但是,如果您输入0、1或2,它将起作用。

function factorial(n) {
  if (n === 0) {
    return 0;
  }else {
      return (n * factorial((n-1)*(n-1)));
  }
}

console.log("fac0: "+factorial(0));
console.log("fac1: "+factorial(1));
console.log("fac2: "+factorial(2));
console.log("fac3: "+factorial(3));

答案 1 :(得分:0)

您需要在下一次递归时将值减少一个,而不是取减少值的乘积。

由于0!的定义,如果值为零,则需要返回1。

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

console.log(factorial(0));
console.log(factorial(1));
console.log(factorial(2));
console.log(factorial(3));
console.log(factorial(10));

答案 2 :(得分:0)

通常,要使递归函数起作用,它需要具有递归停止的基本情况。它还需要比原始问题更简单的递归步骤,从而减少工作量,从而最终达到基本要求。

因此,请看一下您的代码:

function factorial(n) {
  if (n === 0) {
    return 0;
  }else {
      return (n * factorial((n-1)*(n-1))); // problem is here
  }
}

它有一个基本情况,当0为零时,它返回n。因此factorial(0) // ==> 0。现在说我们用3来尝试。

factorial(3);                   // ==
3 * factorial((3-1)*(3-1));     // ==
3 * factorial(4);               // ==
3 * 4 * factorial((4-1)*(4-1)); // ==
3 * 4 * factorial(9);           // == 

要求递归是一个更简单的问题。 factorial(4)并不比factorial(3)简单,因此这种递归永远不会达到基本情况。

如果要实现factorial,则基本情况应返回1而不是0,并且递归总是比当前值小一。 factorial(2)是一个比factorial(3)更简单的问题,因为它将使基本情况变热,结果是3 * 2 * 1 * 1