【问题标题】:Recursive JavaScript Function Results in "Range Error: Maximum call stack size exceeded"递归 JavaScript 函数导致“范围错误:超出最大调用堆栈大小”
【发布时间】:2020-07-12 06:27:46
【问题描述】:

我正在尝试创建一个生成阶乘的简单递归 JavaScript 函数。我想我在运行下面的代码时耗尽了调用堆栈中的本地内存,并可能触发无限递归。

*注意:我想用递归来解决。

function factorial(num, factor) {
  //loop through descending order multiply
  if (num === 1) {
    return newNum
  }
  let newNum = num --;
  let newProduct = num * newNum;
    //recurse
  return factorial(newNum, newProduct);
}

// Test cases
console.log(factorial(4)); // -> 24
console.log(factorial(6)); // -> 720
console.log(factorial(0)); // -> 1

关于如何以及为何修改上述代码的任何建议。

【问题讨论】:

标签: javascript recursion


【解决方案1】:

你的减量有问题:那是因为操作数的原始值在操作数被更改之前被返回(你需要将 num-- 更改为--num)。你能看看这个https://codeburst.io/javascript-increment-and-decrement-8c223858d5ed。您可以通过此更改您的代码

function factorial(num, factor=1) {
  //loop through descending order multiply
  if (num <= 1) {
    return factor
  }

  let newProduct = factor * num--;
    //recurse
  return factorial(num, newProduct);
}

【讨论】:

  • 谢谢。这解决了前两个测试用例。但是对于输入为 0 的最后一个测试用例,它仍然返回:“范围错误:超出最大调用堆栈大小”
  • 第一次迭代后是否 newProduct 代替了 factor=1?我正在尝试理解代码,以确切了解相乘值是如何保存在循环中每个步骤之间的参数中的。
猜你喜欢
  • 2014-01-18
  • 1970-01-01
  • 2019-09-09
  • 2015-09-27
  • 2012-03-18
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多