如何使无限循环(for(;;))不崩溃?

时间:2017-02-20 16:49:55

标签: javascript loops for-loop

我是JS的新手,所以我的大部分代码都没有用。我已经制作了一个程序来查找每个素数,但每次使用它时,它都会崩溃。有没有办法让这段代码在运行时不会崩溃?

var i = 0;

for (;;) {
    if (i % 2 === 0 || i % 3 === 0 || i % 5 === 0 || i % 7 === 0) {
        i++;
    }
    else {
        return i;
        i++;

    }
}

2 个答案:

答案 0 :(得分:1)

正确的方法是使用单个计时器。使用setInterval,您可以按如下方式实现所需:

window.onload = function start() {
    primes();
}
function primes() {
    var i = 0;
    window.setInterval(function () {
        if (i % 2 === 0 || i % 3 === 0 || i % 5 === 0 || i % 7 === 0) {
            i++;
        } else {
            console.log(i);
            i++;
        }
    }, 1000); // repeat forever, new value every 1 second
}

一旦找到匹配项,它就会将值打印到控制台(它每秒都会检查一次)。但是你可以在setInterval函数的第二个参数上调整它。

如果您想在实际页面上显示结果,可以使用document.createTextNode()替换console.log()。

另外,我没有检查过这个或知道算法是否正确。刚改编自您的代码。

答案 1 :(得分:0)

修正清单:

  • 您手动更新i并使用空白for循环而不是正常使用for循环,但中间条件始终返回true(此处也可以使用while循环,但仍会需要手动更新i),因为您不打算停止。但是,实际上你可以把整个事情放在一个计时器而不是一个循环中,就像@Leonel Atencio那样。
  • 你在一个函数之外使用return,如果你把这个代码放在一个函数中,它每次都会返回第一个素数,所以它总会返回1。 / LI>
  • 公式不正确,只检查素数的一些例子;正如@ Alexandru-Ionut Mihai所说,即使它是11x11,121也会被视为素数。

修正:

var primes = [];
var i = 1; //Start at 2; since "i" is incremented at the start of the function, this won't start it at 1, which would cause problems (the array would only have 1 in it, since all other whole numebrs are divisible by one)
setInterval(primeFunc,100);
function primeFunc(){
    i++; //Increment current number
    isPrime=true; //Assume prime
    for(var j=0;j<primes.length;j++){ //Rule out non-primes with the power of modulo
        if(i%primes[j]==0) { //If the current number can be divided (is divisible) by any previous prime...
            //...then it's not a prime, so cancel any further chacks and move on
            isPrime=false;
            break;
        }
    }
    if(isPrime){
        //The current number is not divisible by any other primes, so it is itself a prime; if it was divisible, isPrime would be set to false by our loop above
        primes.push(i);
        output.innerHTML=primes;
    }
}
<span id="output"></span>