Циклы , loops , как работает цикл внутри цикла?

218
01 марта 2018, 14:40

Добрый день , совсем недавно начал учить программирование на js , это мой первый ЯП , хотел бы у вас узнать как работают циклы внутри циклов, не могу сделать одну задачу (исключительно в учебных целях , копипаст мне не нужен, а толковое обьяснение, я здесь чтобы учится)

К примеру вот задача взята с learn.js.ru

Не понимаю как ведет себя j внутри i

nextPrime: for (var i = 2; i < 10; i++) { 
        for (var j = 2; j < i; j++) { 
            if (i % j === 0) continue nextPrime; 
        } 
        alert(i); 
    }

Надеюсь не заминусуете, спасибо если кто откликнется!

Answer 1

Давайте по очереди с комментариями в коде:

// Создаём цикл с названием nextPrime,
// где начальное значение - 2 (i = 2),
// максимальное значение - 9 (i < 10 = "<= 9")
nextPrime: for (var i = 2; i < 10; i++) {
    // Создаём ещё один цикл без названия,
    // где начальное значение - 2 (j = 2),
    // максимальное значение - "i - 1" (j < i),
    // т.е. из цикла выше (nextPrime)
    // мы при каждом проходе получаем значение i (i = 2, i = 3, i = 4 и т.д.)
    // и при каждом запуске этого внутреннего цикла -
    // запускаем его на промежутке от 2 до текущего значения i,
    // не включая его (2 <= j < i)
    for (var j = 2; j < i; j++) {
        // Если текущий i кратен j (i % j),
        if (i % j === 0) {
            // то останавливаем дальнейшее выполнение данной итерации цикла `nextPrime`
            // (и все циклы, находящиеся внутри него)
            // и переходим к следующей итерации
            continue nextPrime;
        }
    }
    // Выводим alert с текущим значением i (из цикла nextPrime),
    // если данная итерация не была прервана при условии выше
    alert(i);
}

Для закрепления приведу пример выполнения с нумерацией циклов, где первое значение - i, второе значение (через точку) - j (т.е.: "i.j)":

  • 3.2) Т.к. i % j = 1 - выводим алерт со значением "3";
  • 4.2) Т.к. i % j = 0 (остаток от деления i на j) - то пропускаем данный цикл: continue nextPrime;
  • 5.2) Т.к. i % j = 1 - выводим алерт со значением "5";
  • 5.3) Т.к. i % j = 2 - выводим алерт со значением "5";
  • 5.4) Т.к. i % j = 1 - выводим алерт со значением "5";
  • 6.2) Т.к. i % j = 0 - то пропускаем данный цикл: continue nextPrime;
  • 7.2) Т.к. i % j = 1 - выводим алерт со значением "7";
  • 7.3) Т.к. i % j = 1 - выводим алерт со значением "7";
  • 7.4) Т.к. i % j = 3 - выводим алерт со значением "7";
  • 7.5) Т.к. i % j = 2 - выводим алерт со значением "7";
  • 7.6) Т.к. i % j = 1 - выводим алерт со значением "7";
  • 8.2) Т.к. i % j = 0 - то пропускаем данный цикл: continue nextPrime;
  • 9.2) Т.к. i % j = 1 - выводим алерт со значением "9";
  • 9.3) Т.к. i % j = 0 - то пропускаем данный цикл: continue nextPrime;
Answer 2

Вот так понятнее?

console.log("Начинаем внешний цикл"); 
nextPrime: for (var i = 2; i < 10; i++) { 
  console.log("  Итерация внешнего цикла. i = " + i); 
  if (2 < i) 
    console.log("  Начинаем внутренний цикл"); 
  for (var j = 2; j < i; j++) { 
    console.log("    Итерация внутреннего цикла. j = " + j + ", i = " + i); 
    if (i % j === 0) { 
      console.log("    Условие (i % j === 0) выполнено. запускаем новую итерацию внешнего цикла"); 
      continue nextPrime; 
    } 
  } 
  // alert(i); 
  console.log("  Закончили внутренний цикл. i = " + i); 
} 
 
console.log("Закончили внешний цикл");

READ ALSO
Помогите запустить проект

Помогите запустить проект

Помогите с запуском проекта, накрывает ошибками при сборке вебпака https://githubcom/cjsheets/angular-voting-app Не могу разобраться с firebase для него, в ридми толком...

157
Книга &ldquo;You don&#39;t know javascript&rdquo; [требует правки]

Книга “You don't know javascript” [требует правки]

Друзья, добрый день! Скажите, будьте любезны, существует ли книга "You don't know javascript" на русском?

209