2017-09-25 67 views
0

创建fibonachi数字数组:为什么这是无限循环? (JavaScript)的

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

这给了我无限循环。

如果我在list.push(next);之后加上next = list[list.length-1] + list[list.length-2];就行了。 为什么?

+1

你只调用函数一次,有你的循环内没有增量。 num ALWAYS = 10 and next ALWAYS = list [list.length-1] + list [list.length-2];所以...它会永远持续下去。正如你注意到的那样,当你在while循环中添加增量时,它就像它应该那样工作。 – Ben

+1

如果您在循环体中既不修改'next'也不修改'num',条件'next <= num'怎么会从true变为false? *当然*你有一个无限循环。 –

+0

您只在循环的外部赋值给'next'变量一次,因此循环内部没有任何变化可以满足返回条件。顺便说一句,你应该使用该条件作为'while'循环的条件,而不是'true',并在循环之后返回。 –

回答

1

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

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

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

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

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