Если ты тоже когда-то смотрел на рекурсивную функцию и чувствовал, будто попал в бесконечное отражение в зеркале — добро пожаловать! Эта статья для тебя. Сегодня разложим рекурсию по полочкам. Просто, весело, на пальцах и с кучей примеров. Погнали! 🚀
Рекурсия — это когда функция вызывает саму себя (не паникуй!). Это нужно, чтобы решить задачу, разбив её на подзадачи поменьше. Повторяется это до тех пор, пока не достигнем так называемого базового случая — точки остановки.
🎭 Представь себе бесконечное отражение между двумя зеркалами. Ты, потом чуть меньше ты, потом совсем микроту — и так далее. Вот это и есть рекурсия. Только вместо отражений — вызовы функций. Причём каждый из этих вызовов чуть проще предыдущего, пока не дойдём до того, с которым справится даже чайник (в смысле, чайник-функция!).
📦 Или другой пример: представь коробку в коробке, а в ней ещё коробку, и так до тех пор, пока не дойдёшь до последней, самой маленькой. В программировании эта последняя коробка — и есть наш базовый случай. Всё, дальше «распаковывать» нечего, пора собирать результат обратно.
Факториал числа n
(обозначается n!
) — это произведение всех чисел от 1
до n
.
Пример:
5! = 5 × 4 × 3 × 2 × 1 = 120
Рекурсивная реализация на Python:
def factorial(n):
if n == 0 or n == 1:
return 1
else:
return n * factorial(n - 1)
Каждый вызов уменьшает n
, пока не достигнем 1 или 0, и тогда функция начинает возвращать результат. Очень похоже на спуск с горки с возвращением обратно по ступенькам.
n
А давай теперь сложим все числа от 1
до n
:
def sum_to(n):
if n == 1:
return 1
else:
return n + sum_to(n - 1)
Вызов sum_to(5)
:
sum_to(5)
= 5 + sum_to(4)
= 5 + (4 + sum_to(3))
= 5 + (4 + (3 + sum_to(2)))
= 5 + (4 + (3 + (2 + sum_to(1))))
= 5 + 4 + 3 + 2 + 1 = 15
Вот она, магия рекурсии: задача «уменьшается» до понятной, а потом «складывается» в ответ.
def countdown(n):
if n == 0:
print("Поехали!")
else:
print(n)
countdown(n - 1)
Запусти countdown(5)
— и ты увидишь:
5
4
3
2
1
Поехали!
Рекурсия не всегда должна возвращать значения — она может просто выполнять действия. Это отличный способ начать её применять!
❌ Забыли базовый случай — и привет бесконечной рекурсии. Проверяй, где функция должна остановиться.
❌ Неправильное условие — например, if n == 0
вместо n <= 0
, и ты снова улетел в бесконечность.
❌ Рекурсия там, где проще без неё — всегда спрашивай себя: "А точно ли тут нужна рекурсия?".
Рекурсия удобна, когда:
Нужно обойти вложенные структуры, например папки или JSON.
Задача естественно делится на части (например, сортировка, дерево поиска).
Нужно пробовать все пути — идеальна для поиска решений в головоломках (лабиринт, судоку и пр.).
Каждое рекурсивное обращение — дополнительная память (стек вызовов).
Много уровней → стек переполняется (особенно в Python).
Работает медленнее, чем обычные циклы, если не оптимизировать.
✏️ Рисуй — дерево вызовов, стек, последовательность действий.
🎮 Практикуйся — решай задачи, даже простейшие: факториал, сумма, строка в обратном порядке.
🔍 Следи за выполнением — пошагово, с print()
или в отладчике.
🧪 Сравни с циклами — пиши обе версии, чтобы увидеть плюсы и минусы.
def reverse_string(s):
if len(s) == 0:
return ""
return s[-1] + reverse_string(s[:-1])
reverse_string("Кодик")
→ "кидоК"
Так можно переворачивать строки, причём красиво и понятно.
Рекурсия — это:
способ разбивать задачу на простые шаги;
функция, вызывающая себя до достижения базового условия;
магия, которую можно приручить.
Если ты всё ещё не до конца понял — перечитай статью ещё раз. Это тоже рекурсия 😉
Не нашли нужной статьи?
Напишите нам и ее сделаем!