【问题标题】:JavaScript - Maximum call stack size exceededJavaScript - 超出最大调用堆栈大小
【发布时间】:2019-05-21 19:41:38
【问题描述】:

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

我使用 nodejs 是为了避免在浏览器中使用 JS 控制台。

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

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

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

超过最大调用堆栈大小。

谢谢。

【问题讨论】:

标签: javascript recursion


【解决方案1】:

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

如果你的值为零,你需要返回一个,因为0!的定义

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】:

这是因为当你输入n超过2时,factorial((n-1)*(n-1))会返回更多的数字。因此,从那时起它将是一个无限递归函数调用。但是,如果您输入 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));

【讨论】:

    【解决方案3】:

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

    所以看看你的代码:

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

    它有一个基本情况,当n 为零时它返回0。因此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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 2012-03-18
      • 2013-08-23
      • 1970-01-01
      • 2015-10-24
      • 2015-12-29
      • 2017-12-27
      相关资源
      最近更新 更多