JavaScript 使用递归的斐波那契

JavaScript fibonacci using recursion

尝试使用递归使我的斐波那契数列起作用,但 运行 出现错误 maximum callstack exceeded

代码:

var genFib = function(count, limit, fibArray) {
  if (count === undefined || count === null) {
    var count = 0;
  }

  if (fibArray === undefined || fibArray === null) {
    var fibArray = [0, 1];
  }

  if (count === limit) {
    console.log(fibArray);
    return fibArray;
  }

  var pushFibNo = function(fibArray) {
    fibArray.push(fibArray[fibArray.length - 1] + fibArray[fibArray.length - 2]);
    return fibArray;
  };

  // console.log(count++);
  // console.log(limit);
  // console.log(pushFibNo(fibArray));

  return genFib(count++, limit, pushFibNo(fibArray));

};

genFib(null, 50, null);

底部的三个 console.logs 正在注销正确的数字,但我仍然收到 maximum callstack 错误。

if (count === undefined || count === null) {
    var count = 0;
}

您已再次声明 "count"。这会覆盖计数参数,并且永远不会调用 if(count === limit)。

++ 的行为在后缀和前缀表示法中有所不同。

来自MDN

If used postfix, with operator after operand (for example, x++), then it returns the value before incrementing.

If used prefix with operator before operand (for example, ++x), then it returns the value after incrementing.

这意味着您总是在递增之前传递 count,导致堆栈溢出。

要解决您的问题,请更改

return genFib(count++, limit, pushFibNo(fibArray));

return genFib(++count, limit, pushFibNo(fibArray));

问题是您在这一行中使用了后增量

return genFib(count++, limit, pushFibNo(fibArray));

那么你总是调用具有相同值的函数 "count",如果你使用预运算符应该有效。

return genFib(++count, limit, pushFibNo(fibArray));