Циклы
Зачем это нужно
Компьютер хорош тем, что не устаёт повторять. Вывести сто строк, проверить тысячу чисел, пройти по всем товарам в корзине — для этого есть циклы: код, который выполняется много раз подряд.
Цикл for
Самый частый цикл — со счётчиком:
for (let i = 1; i <= 5; i++) {
console.log("Шаг", i);
}
Вывод:
Шаг 1
Шаг 2
Шаг 3
Шаг 4
Шаг 5
В скобках три части через ;:
let i = 1— начало: создаём счётчик (выполняется один раз);i <= 5— условие: пока оно верно, цикл крутится;i++— шаг: что делать со счётчиком после каждого повтора.
Один проход тела цикла называют итерацией. Счётчик может идти и в обратную сторону, и с другим шагом:
for (let i = 10; i > 0; i -= 3) {
console.log(i);
}
Вывод:
10
7
4
1
Накопление результата
Типичный приём — завести переменную до цикла и копить в ней:
let total = 0;
for (let i = 1; i <= 4; i++) {
total += i * i;
}
console.log(total);
Вывод:
30
(1 + 4 + 9 + 16 = 30)
Цикл while
while крутится, пока условие верно. Удобен, когда заранее неизвестно, сколько будет шагов:
let money = 1000;
let years = 0;
while (money < 2000) {
money *= 1.1; // +10% в год
years++;
}
console.log("Удвоится через", years, "лет");
Вывод:
Удвоится через 8 лет
do … while
То же, но условие проверяется после тела — поэтому тело выполнится хотя бы один раз:
let n = 0;
do {
console.log("Выполнился, хотя n =", n);
} while (n > 0);
Вывод:
Выполнился, хотя n = 0
break и continue
break— немедленно выйти из цикла;continue— пропустить остаток текущего шага и перейти к следующему.
for (let i = 1; i <= 10; i++) {
if (i % 2 === 0) continue; // чётные пропускаем
if (i > 7) break; // после 7 — стоп
console.log(i);
}
Вывод:
1
3
5
7
В функции вместо break часто пишут return — он выходит и из цикла, и из функции сразу.
Вложенные циклы
Цикл внутри цикла — например, таблица умножения:
for (let row = 1; row <= 3; row++) {
let line = "";
for (let col = 1; col <= 3; col++) {
line += row * col + " ";
}
console.log(line);
}
Вывод:
1 2 3
2 4 6
3 6 9
Как это работает внутри
Движок выполняет for так: начало → проверка условия → тело → шаг → проверка → тело → шаг… пока
условие не станет ложным. Если условие никогда не станет ложным, получится бесконечный цикл:
программа зависнет. На сайте такой код остановится по таймеру с ошибкой. Поэтому всегда проверяй,
что счётчик действительно движется к выходу.
Про скорость: проверка делителей до √n вместо n — огромная разница. Для n = 1 000 000 007 это
около 31 623 шагов вместо миллиарда. Если у числа есть делитель больше √n, то у него обязательно
есть и парный делитель меньше √n — его мы найдём раньше.
Частые ошибки
- Бесконечный цикл. Забыли
i++или изменение переменной вwhile— цикл никогда не закончится. - Ошибка на единицу.
i < 5даёт 1…4, аi <= 5— 1…5. Проверяй границы на маленьком примере. - Переменная-копилка внутри цикла.
for (…) { let sum = 0; sum += i; }— сумма каждый раз обнуляется. Объявляй копилку до цикла. returnвнутри цикла раньше времени.return trueв первой же итерации прервёт проверку. Возвращай «успех» только после цикла.- Точка с запятой после скобок.
for (…);{ … } — у цикла пустое тело, а блок выполнится один раз.
Шпаргалка
| Что | Как |
|---|---|
| Со счётчиком | for (let i = 0; i < n; i++) { … } |
| Пока верно | while (условие) { … } |
| Хотя бы раз | do { … } while (условие); |
| Выйти из цикла | break |
| К следующему шагу | continue |
| Копилка | let sum = 0; до цикла, sum += … внутри |