Циклы: повторение в алгоритмах
Циклы в алгоритмах: обратное ребро, 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 = 0 | s = s + i |
| Произведение | p = 1 | p = p * i |
| Количество (по условию) | k = 0 | k = 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раз — это основа работы с таблицами. - Если тело цикла не меняет переменные из условия — цикл бесконечный, это ошибка.