最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

JavaScript fibonacci using recursion - Stack Overflow

programmeradmin1浏览0评论

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.

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.

Share Improve this question edited Mar 15, 2016 at 16:14 asked Mar 15, 2016 at 16:11 user6017908user6017908 7
  • How many numbers (aprox) are you getting before getting the error? – Soren 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? – user6017908 Commented Mar 15, 2016 at 16:17
  • See my answer below, you are always using the same count. – pishpish Commented Mar 15, 2016 at 16:20
  • 1 Both answers are correct – Kevin B 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 – ThisClark Commented Mar 15, 2016 at 16:21
 |  Show 2 more ments

3 Answers 3

Reset to default 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));
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.

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));
发布评论

评论列表(0)

  1. 暂无评论