Reputation:
Trying to get my fibonacci sequence to work using recursion but am running into the error maximum callstack exceeded
.
Code:
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);
The three console.logs
towards the bottom are logging out correct numbers, but I'm still getting the maximum callstack
error.
Upvotes: 3
Views: 524
Reputation: 2614
The behaviour of ++
is different in postfix and prefix notation.
From 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.
This means that you are always passing count
before incrementing it, resulting in stack overflow.
To solve your problem, change
return genFib(count++, limit, pushFibNo(fibArray));
To
return genFib(++count, limit, pushFibNo(fibArray));
Upvotes: 11
Reputation: 5948
The problem was that you was using the postincrement in this line
return genFib(count++, limit, pushFibNo(fibArray));
Then you always called the fucntion with the same value for "count", if you use the preoperator should works.
return genFib(++count, limit, pushFibNo(fibArray));
Upvotes: 0
Reputation: 554
if (count === undefined || count === null) {
var count = 0;
}
you have declared "count" again. this overrides the count parameter and the if(count === limit) is never called.
Upvotes: 2