Циклы: повторение в алгоритмах

Циклы в алгоритмах: обратное ребро, while и for, счётчик и накопитель, бесконечный цикл, четыре типовых паттерна (сумма, произведение, количество, максимум) и вложенные циклы.

Компьютеры обожают повторять. Сложить тысячу чисел, проверить миллион паролей, перебрать все варианты — для нас тоска, для машины — доли секунды. Конструкция, которая заставляет алгоритм повторять шаги, называется циклом, и на блок-схеме её выдаёт особая примета — стрелка, ведущая назад.

Обратное ребро — сердце цикла

В линейных алгоритмах и ветвлениях стрелки ведут только вперёд, к концу схемы. Цикл нарушает это правило: одна из стрелок возвращается вверх, к уже пройденному блоку. Это обратное ребро. Увидел на схеме стрелку назад — значит, перед тобой цикл, и какие-то блоки выполнятся несколько раз.

Чтобы цикл не крутился вечно, в нём обязательно есть условие выхода. Часть схемы, которая повторяется, называется телом цикла.

Цикл while: повторяй, пока условие истинно

Цикл while работает так: проверь условие в ромбе; если «да» — выполни тело и вернись к проверке; если «нет» — выходи из цикла и иди дальше. Напечатаем числа от 1 до 5:

n = 1
while n <= 5:
    print(n)
    n = n + 1
print("Готово")

Пройди схему по шагам и посчитай, сколько раз исполнитель пробежит по обратному ребру. Обрати внимание на строку n = n + 1: без неё n навсегда осталось бы единицей, условие n <= 5 никогда не стало бы ложным — и цикл превратился бы в бесконечный. Команда, которая приближает цикл к завершению, обязана быть в теле.

Бесконечный цикл — классическая ошибка. Проверяй себя вопросом: «что в теле цикла меняет переменные из условия?» Если ничего — алгоритм зависнет.

Цикл for: когда число повторений известно

Если заранее известно, сколько раз повторять, удобнее цикл со счётчиком — for. На схемах по ГОСТ он рисуется шестиугольником: внутри записано, как меняется счётчик, а обратное ребро возвращается к шестиугольнику после каждого витка.

В Python счётчик задаёт range: запись range(1, 6) означает «i пробегает 1, 2, 3, 4, 5» — правая граница не включается. Классика жанра — сумма чисел от 1 до 5:

s = 0
for i in range(1, 6):
    s = s + i
print(s)

Запусти схему и следи за переменными: s по очереди принимает значения 1, 3, 6, 10, 15. Здесь работают два героя:

  • счётчик i — считает витки цикла, его меняет сам for;
  • накопитель s — собирает сумму; перед циклом его обнуляют, а в теле прибавляют очередное слагаемое.

Четыре типовых паттерна цикла

Большинство задач на циклы — это вариации одного приёма «обнули накопитель — крути цикл — обновляй». Меняется только начальное значение и операция в теле:

ЗадачаНакопитель в началеДействие в теле
Суммаs = 0s = s + i
Произведениеp = 1p = p * i
Количество (по условию)k = 0k = k + 1
Максимумm = первый элементобновить, если текущий больше

Произведение начинают с единицы, а не с нуля: умножение на ноль всё обнулило бы. Это и есть факториал — произведение чисел от 1 до n. Посчитаем 5! = 120:

p = 1
for i in range(1, 6):
    p = p * i
print(p)

Когда while незаменим

А если число повторений заранее неизвестно? Например: сколько раз нужно разделить число на 2 (нацело), чтобы оно обратилось в ноль? Ответ зависит от самого числа — тут нужен while:

n = int(input("Введите число"))
k = 0
while n > 0:
    n = n // 2
    k = k + 1
print("Шагов:", k)

Введи 37 и пройди схему: 37 → 18 → 9 → 4 → 2 → 1 → 0, итого 6 шагов. Здесь k — счётчик, но управляет циклом не он, а условие n > 0.

Вложенные циклы

Тело цикла может само содержать цикл — получается вложенный цикл. Внешний цикл делает один виток, а внутренний за это время прокручивается полностью. Классика — таблица умножения. Запусти код (внутренний цикл выполнится 3 раза на каждый виток внешнего, итого 9 строк):

for i in range(1, 4):
    for j in range(1, 4):
        print(i, "x", j, "=", i * j)

Вывод:

1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9

Правило простое: если внешний цикл крутится n раз, а внутренний m раз, то тело внутреннего выполнится n × m раз. Вложенные циклы нужны везде, где данные двумерны: таблицы, клетки поля, пары элементов.

Как выбрать цикл

СитуацияЦиклФигура на схеме
Число повторений известно заранееforШестиугольник
Повторяем, пока выполняется условиеwhileРомб с обратным ребром

Что мы узнали

  • Цикл — конструкция для повторения шагов; на схеме его выдаёт обратное ребро — стрелка назад.
  • while повторяет тело, пока условие в ромбе истинно; в теле обязано быть действие, приближающее выход.
  • for — цикл со счётчиком, на схеме рисуется шестиугольником; range(a, b) не включает правую границу.
  • Счётчик считает повторения, накопитель собирает результат; сумму обнуляют, произведение начинают с единицы.
  • Вложенный цикл выполняет тело n × m раз — это основа работы с таблицами.
  • Если тело цикла не меняет переменные из условия — цикл бесконечный, это ошибка.
Проверьте себя
1. По какому признаку на блок-схеме узнают цикл?
AПо ромбу
BПо обратному ребру — стрелке назад
CПо параллелограмму
DПо овалу «Конец»
2. Сколько чисел переберёт for i in range(1, 6)?
A6 чисел: 1..6
B5 чисел: 1..5
C4 числа: 2..5
DБесконечно
3. С какого значения начинают накопитель произведения?
AС 0
BС 1
CС −1
DС самого большого числа
4. Из-за чего цикл while становится бесконечным?
AЕсли тело не меняет переменные из условия
BЕсли в теле есть print
CЕсли счётчик начинается с нуля
DЕсли условие записано в ромбе
5. Внешний цикл крутится 4 раза, внутренний — 3. Сколько раз выполнится тело внутреннего?
A7
B12
C4
D3
Поддержать проект