JavaScript fibonacci使用递归

时间:2016-03-15 16:11:46

标签: javascript recursion fibonacci

尝试使用递归使我的斐波那契序列工作但遇到错误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错误。

3 个答案:

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