【问题标题】:JavaScript fibonacci using recursion使用递归的 JavaScript 斐波那契
【发布时间】:2016-07-01 04:56:06
【问题描述】:

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

【问题讨论】:

  • 在收到错误之前您获得了多少个数字(大约)?
  • 找到了——你不能将count++作为参数传入底部的return语句中,你必须传入count += 1。谁能解释一下为什么?
  • 在下面看我的回答,你总是使用相同的计数。
  • 两个答案都正确
  • 我认为 count++ 在您将其发送到递归调用后会增加 1,因此您实际上总是发送初始值,在这种情况下为零。查看@janje 的回答

标签: javascript recursion fibonacci


【解决方案1】:

++ 的行为在后缀和前缀表示法上有所不同。

来自MDN

如果使用后缀,操作数后面有运算符(例如,x++),则返回递增前的值。

如果在操作数之前使用运算符前缀(例如,++x),则返回递增后的值。

这意味着你总是在递增之前传递count,导致堆栈溢出。

为了解决你的问题,改变

return genFib(count++, limit, pushFibNo(fibArray));

return genFib(++count, limit, pushFibNo(fibArray));

【讨论】:

    【解决方案2】:
    if (count === undefined || count === null) {
        var count = 0;
    }
    

    您再次声明了“计数”。这会覆盖 count 参数,并且永远不会调用 if(count === limit)。

    【讨论】:

    • 这是错误的,第一次运行后count 始终为0。它不会被重新声明。
    • 即使 var 在 if 语句中,javascript 在任何情况下都认为它已声明。确实,虽然上面的代码还有其他问题(请参阅其他解决方案)
    • 好主意,但是,重新声明变量不会使其失去价值。
    • 你是对的。在那里声明变量看起来仍然不正确,但问题的根源在其他地方(使用 ++ 运算符)。
    • 同意,var 的使用是不必要且令人困惑的。
    【解决方案3】:

    问题是你在这一行中使用了后增量

    return genFib(count++, limit, pushFibNo(fibArray));
    

    那么你总是用相同的“count”值调用函数,如果你使用 preoperator 应该可以工作。

    return genFib(++count, limit, pushFibNo(fibArray));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-03
      • 2019-01-21
      • 2014-04-02
      • 1970-01-01
      • 2017-11-18
      • 2014-01-08
      • 2011-12-14
      相关资源
      最近更新 更多