为什么这是无限循环? (JavaScript的)

时间:2017-09-25 22:45:52

标签: javascript

创建一个fibonachi数字数组:

function sumFibs(num) {
  var list = [1,1];
  var next = list[list.length-1] + list[list.length-2];

  while (true) {
    if (next<=num) {
      list.push(next);
    } else {
    return list;
    }
  }
}

sumFibs(10);

这给了我无限循环。

如果我在next = list[list.length-1] + list[list.length-2];之后添加list.push(next);,则可以正常使用。 为什么呢?

1 个答案:

答案 0 :(得分:1)

next变量每次引用时都不会更新。如果确实如此,想象一下程序会有多混乱。

您可以将列表最后成员的评估移动到循环中。

&#13;
&#13;
function sumFibs(num) {
  var list = [1, 1];
  var next = list[list.length - 1] + list[list.length - 2];

  while (true) {
    if (next <= num) {
      list.push(next);
      next = list[list.length - 1] + list[list.length - 2]
    } else {
      return list;
    }
  }
}

console.log(sumFibs(10));
&#13;
&#13;
&#13;

这是一个不依赖于循环的不同实现。

&#13;
&#13;
function sumFibs(num) {
  return f(num, [1, 1]);

  function f(n, arr) {
    var next = arr[arr.length - 1] + arr[arr.length - 2];
    return next <= num ? f(n, arr.concat(next)) : arr;
  }
}

console.log(sumFibs(10));
&#13;
&#13;
&#13;