尝试使用递归使我的斐波那契序列工作但遇到错误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
错误。
答案 0 :(得分:12)
++
的行为在后缀和前缀表示法中有所不同。
来自MDN:
如果使用postfix,在操作数之后使用运算符(例如,x ++),则在递增之前返回该值。
如果在操作数之前使用带有运算符的前缀(例如,++ x),则在递增后返回该值。
这意味着在递增之前总是传递count
,导致堆栈溢出。
要解决您的问题,请更改
return genFib(count++, limit, pushFibNo(fibArray));
要
return genFib(++count, limit, pushFibNo(fibArray));
答案 1 :(得分:2)
if (count === undefined || count === null) {
var count = 0;
}
你已宣布"计数"再次。这会覆盖count参数,并且永远不会调用if(count === limit)。
答案 2 :(得分:0)
问题是你在这一行使用了后增量
return genFib(count++, limit, pushFibNo(fibArray));
然后你总是用“count”的相同值调用fucntion,如果你使用preoperator应该有效。
return genFib(++count, limit, pushFibNo(fibArray));