2017-02-20 11 views
-1

Я новичок в JS, поэтому большая часть моего кода не сработала. Я сделал программу, чтобы узнать каждое простое число, но каждый раз, когда я его использую, он падает. Есть ли способ сделать этот код не сбой при запуске?Как сделать бесконечный цикл for (for (;;)) не сбой?

var i = 0; 

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

    } 
} 
+1

Это не правильный алгоритм для простых чисел. '121' например, в вашем коде рассматривается как простое число –

+3

' return' вне функции? –

+2

'i ++' после выражения 'return' не имеет смысла –

ответ

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.

Если вы хотите получить результаты на фактической странице, вы можете заменить console.log() на document.createTextNode().

Кроме того, я не проверял это или не знаю, является ли алгоритм правильным. Просто адаптирован из вашего кода.

0

Список исправлений:

  • Вы вручную обновить i и использовать пробел для контура вместо использования для цикла нормально, но имеющие среднее условие всегда возвращает истину (петля while может быть использована и здесь, но все равно потребуется вручную обновить i), поскольку вы не планируете останавливаться. Однако на самом деле вы можете просто поставить все в таймер вместо цикла, например @Leonel Atencio.
  • Вы используете return вне функции, и если бы вы ввели этот код внутри функции, он просто возвращал бы первое простое число каждый раз, поэтому он всегда возвращал 1.
  • Формула неверна, только проверка некоторых примеров простых чисел; Как сказал Alexandru-Ionut Mihai, 121 будет считаться простым, хотя это 11x11.

Исправлено:

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>

Смежные вопросы