user6017908
user6017908

Reputation:

JavaScript fibonacci using recursion

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

Answers (3)

pishpish
pishpish

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

cralfaro
cralfaro

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

Massimo Franciosa
Massimo Franciosa

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

Related Questions