В маркетплейсе по итогам месяца пяти продавцам нужно начислить бонус — одинаковое действие, только каждый раз с новым продавцом. В лоб это выглядит так:
Пять строк, почти совпадающих буква в букву. Пока продавцов пять — терпимо. Станет пятьдесят — так уже никто не пишет. Компьютер хорошо повторяет одно и то же действие; не хватает способа сказать ему: что именно повторять и когда остановиться.
Программа напечатает те же пять строк, что и руками. На каждом шаге seller_id увеличивается на 1. Когда он становится равным 6, условие seller_id <= 5 перестаёт выполняться, и цикл останавливается.
У любого цикла есть три части:
начальное состояние — seller_id = 1
условие продолжения — seller_id <= 5
изменение состояния — seller_id = seller_id + 1
Если забыть третью часть, условие может никогда не измениться. Тогда программа зациклится.
Сумма нескольких шагов
Цикл полезен не только для печати. Он позволяет накапливать результат:
Здесь одно и то же действие — прибавить 100 к общей сумме — выполняется пять раз. Без цикла пришлось бы писать пять почти одинаковых строк вручную.
Историческая справка: goto и структурное программирование
Повторение существовало и до while. В ранних языках для него часто использовали goto — безусловный переход к другой строке:
10 LET SELLER = 120 PRINT SELLER30 LET SELLER = SELLER + 140 IF SELLER <= 5 GOTO 2050 END
Такой код работает, но человеку труднее быстро увидеть его форму: где начало повторения, где условие остановки, куда именно идёт переход. В маленьком фрагменте это терпимо. В большом файле с десятками переходов чтение становится медленнее: приходится постоянно восстанавливать маршрут выполнения.
Именно поэтому появились структурные конструкции вроде while: та же логика, но форма видна сразу.
Цикл снимает повторение однотипных шагов. Следующая боль приходит быстро: один и тот же расчёт начинают копировать в разные места программы. Повторение внутри одного шага закрыто, повторение целых кусков логики — ещё нет. За это отвечают функции.
Sources
Dijkstra, E., 1968, Go To Statement Considered Harmful. Communications of the ACM.
Thomas, D. et al., 2023, Programming Ruby 3.3. Pragmatic Bookshelf.