3

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.

7
  • How many numbers (aprox) are you getting before getting the error? Commented Mar 15, 2016 at 16:14
  • Found it- you cannot pass in count++ as a parameter in the return statement towards the bottom, you have to pass in count += 1. Can anyone explain why? Commented Mar 15, 2016 at 16:17
  • See my answer below, you are always using the same count. Commented Mar 15, 2016 at 16:20
  • 1
    Both answers are correct Commented Mar 15, 2016 at 16:20
  • I think count++ increments by 1 after you send it into the recursive call so you're actually always sending in the initial value, in this case zero. See @janje's answer Commented Mar 15, 2016 at 16:21

3 Answers 3

11

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));
Sign up to request clarification or add additional context in comments.

Comments

2
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.

5 Comments

This is wrong, after the first run count is always 0. It does not get redeclared.
even if the var is inside the if statement, javascript consider it declared in any case. it is true though that the code above has also other problems (see the other solution)
Good thinking, however, redeclaring a variable will not make it lose its value.
you're right. it still doesn't look right to declare a variable there but the root of the problem is elsewhere (use of the ++ operator).
Agreed, that use of var is unnecessary and confusing.
0

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));

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.