Пн. Июн 1st, 2026

Рекурсия в программировании

Что такое рекурсия?

Рекурсия — это процесс, при котором функция вызывает саму себя непосредственно или через другие функции. Рекурсивное решение задачи обычно состоит из двух частей:

  • Базовый случай — условие выхода из рекурсии, предотвращающее бесконечные вызовы
  • Рекурсивный шаг — вызов функцией самой себя с измененными параметрами

Преимущества рекурсии

  • Упрощает код для задач, которые можно разбить на подобные подзадачи
  • Позволяет элегантно решать задачи обхода древовидных структур
  • Улучшает читаемость кода для определенных типов задач

Недостатки рекурсии

  • Может потреблять много памяти из-за использования стека
  • Возможность переполнения стека при глубокой рекурсии
  • Обычно менее эффективна по времени, чем итерационные решения

Стек вызовов и организация рекурсии

При каждом рекурсивном вызове в стеке сохраняется информация о:

  • Локальных переменных функции
  • Значениях параметров
  • Адресе возврата
Вызов factorial(3)
Вызов factorial(2)
Вызов factorial(1)
Базовый случай → return 1
return 1 * 1 = 1
return 2 * 1 = 2
return 3 * 2 = 6

Схема работы стека при вычислении factorial(3)

Примеры рекурсивных функций

Вычисление факториала

Факториал числа n (обозначается n!) — произведение всех натуральных чисел от 1 до n.

Рекуррентная формула: \(n! = n \times (n-1)!\)

def factorial(n):
    if n == 0 or n == 1:  # базовый случай
        return 1
    else:                 # рекурсивный шаг
        return n * factorial(n - 1)

Числа Фибоначчи

Последовательность, где каждое число равно сумме двух предыдущих: 0, 1, 1, 2, 3, 5, 8…

Рекуррентная формула: \(F(n) = F(n-1) + F(n-2)\)

def fibonacci(n):
    if n <= 1:            # базовый случай
        return n
    else:                 # рекурсивный шаг
        return fibonacci(n-1) + fibonacci(n-2)

Важное предупреждение

Прямая реализация чисел Фибоначчи крайне неэффективна из-за экспоненциального роста количества вызовов. На практике используют:

  • Итерационные методы
  • Мемоизацию (сохранение результатов вычислений)
  • Динамическое программирование

Прямая и косвенная рекурсия

Прямая рекурсия

Функция вызывает саму себя непосредственно:

def direct_recursion(n):
    if n > 0:
        direct_recursion(n-1)

Косвенная рекурсия

Функция A вызывает функцию B, которая вызывает функцию A:

def function_a(n):
    if n > 0:
        function_b(n-1)

def function_b(n):
    if n > 0:
        function_a(n-1)

Рекурсия vs Итерация

Критерий Рекурсия Итерация
Память Использует стек, может быть переполнение Обычно использует меньше памяти
Скорость Медленнее из-за затрат на вызовы функций Обычно быстрее
Читаемость Лучше для рекурсивных по природе задач Иногда менее интуитивна
Применение Деревья, графы, задачи разделяй и властвуй Простые циклы, линейные структуры

Практические советы по использованию рекурсии

  1. Всегда определяйте базовый случай перед написанием рекурсивной части
  2. Убедитесь, что рекурсивный вызов приближается к базовому случаю
  3. Помните о возможности переполнения стека для глубокой рекурсии
  4. Рассмотрите возможность использования итерации там, где это уместно
  5. Для оптимизации используйте мемоизацию (кэширование результатов)

Заключение

Рекурсия — мощный инструмент в программировании, который позволяет элегантно решать определенные классы задач. Однако важно понимать ее ограничения и правильно использовать, всегда предусматривая базовый случай и убеждаясь, что рекурсивные вызовы сходятся к нему.

Для успешного выполнения заданий ЕГЭ по этой теме рекомендуется практиковаться в написании и анализе рекурсивных функций, а также понимать, как работает стек вызовов.