Понимаем рекурсию: как работает одна из самых загадочных тем в программировании

Ты путаешься в рекурсии и не понимаешь, как она работает? Объясняем простыми словами, на примере факториала и с пошаговым разбором. Никакой магии — только логика!

Если ты тоже когда-то смотрел на рекурсивную функцию и чувствовал, будто попал в бесконечное отражение в зеркале — добро пожаловать! Эта статья для тебя. Сегодня разложим рекурсию по полочкам. Просто, весело, на пальцах и с кучей примеров. Погнали! 🚀


🔎 Что такое рекурсия, если по-человечески?

Рекурсия — это когда функция вызывает саму себя (не паникуй!). Это нужно, чтобы решить задачу, разбив её на подзадачи поменьше. Повторяется это до тех пор, пока не достигнем так называемого базового случая — точки остановки.

🎭 Представь себе бесконечное отражение между двумя зеркалами. Ты, потом чуть меньше ты, потом совсем микроту — и так далее. Вот это и есть рекурсия. Только вместо отражений — вызовы функций. Причём каждый из этих вызовов чуть проще предыдущего, пока не дойдём до того, с которым справится даже чайник (в смысле, чайник-функция!).

📦 Или другой пример: представь коробку в коробке, а в ней ещё коробку, и так до тех пор, пока не дойдёшь до последней, самой маленькой. В программировании эта последняя коробка — и есть наш базовый случай. Всё, дальше «распаковывать» нечего, пора собирать результат обратно.


📌 Пример 1: факториал — любимец рекурсий

Факториал числа 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, и тогда функция начинает возвращать результат. Очень похоже на спуск с горки с возвращением обратно по ступенькам.


📌 Пример 2: сумма чисел до 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

Вот она, магия рекурсии: задача «уменьшается» до понятной, а потом «складывается» в ответ.


📌 Пример 3: обратный отсчёт (и полезный навык)

def countdown(n):
    if n == 0:
        print("Поехали!")
    else:
        print(n)
        countdown(n - 1)

Запусти countdown(5) — и ты увидишь:

5
4
3
2
1
Поехали!

Рекурсия не всегда должна возвращать значения — она может просто выполнять действия. Это отличный способ начать её применять!


🧨 Ошибки, которые делают почти все (и как их избежать)

  1. Забыли базовый случай — и привет бесконечной рекурсии. Проверяй, где функция должна остановиться.

  2. Неправильное условие — например, if n == 0 вместо n <= 0, и ты снова улетел в бесконечность.

  3. Рекурсия там, где проще без неё — всегда спрашивай себя: "А точно ли тут нужна рекурсия?".


🌟 Когда рекурсия действительно рулит

Рекурсия удобна, когда:

  • Нужно обойти вложенные структуры, например папки или JSON.

  • Задача естественно делится на части (например, сортировка, дерево поиска).

  • Нужно пробовать все пути — идеальна для поиска решений в головоломках (лабиринт, судоку и пр.).


📈 Минусы рекурсии (без паники, просто знай о них)

  • Каждое рекурсивное обращение — дополнительная память (стек вызовов).

  • Много уровней → стек переполняется (особенно в Python).

  • Работает медленнее, чем обычные циклы, если не оптимизировать.


✨ Как подружиться с рекурсией навсегда

  1. ✏️ Рисуй — дерево вызовов, стек, последовательность действий.

  2. 🎮 Практикуйся — решай задачи, даже простейшие: факториал, сумма, строка в обратном порядке.

  3. 🔍 Следи за выполнением — пошагово, с print() или в отладчике.

  4. 🧪 Сравни с циклами — пиши обе версии, чтобы увидеть плюсы и минусы.


🧪 Пример 4: переворот строки

def reverse_string(s):
    if len(s) == 0:
        return ""
    return s[-1] + reverse_string(s[:-1])

reverse_string("Кодик")"кидоК"

Так можно переворачивать строки, причём красиво и понятно.


🎬 Подведём итоги

Рекурсия — это:

  • способ разбивать задачу на простые шаги;

  • функция, вызывающая себя до достижения базового условия;

  • магия, которую можно приручить.

Если ты всё ещё не до конца понял — перечитай статью ещё раз. Это тоже рекурсия 😉

Бесплатно
Кодик: Интерактивное обучение!
Изучай HTML, JavaScript, CSS, Python, PHP, SQL, Git
Проходи практические уроки!
Получи сертификат!
Вам может быть интересно

Не нашли нужной статьи?
Напишите нам и ее сделаем!

Бесплатно
Кодик: Интерактивное обучение!
Изучай HTML, JavaScript, CSS, Python, PHP, SQL, Git
Проходи практические уроки!
Получи сертификат!
Главная
Курсы
Блог
Меню