Рекурсивный алгоритм

Рекурсивный алгоритм — алгоритм, в определении которого прямо или косвенно содержится ссылка на него же как на вспомогательный алгоритм[1]. Это способ решения задачи, при котором функция (процедура) вызывает саму себя для обработки подзадач меньшего размера, постепенно сводя решение к базовому случаю — тривиальному варианту, не требующему рекурсивного вызова[2].

Этот метод является фундаментальным в информатике и программировании, так как рекурсия позволяет решать задачи, которые естественным образом разбиваются на подзадачи той же структуры.

Рекурсивные алгоритмы — мощное средство для решения задач с вложенной структурой. Они позволяют[3]:

Общие сведения
Рекурсивный алгоритм
Область использования Информатика

Основные понятия

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

Ключевые элементы рекурсии

  • Базовый случай (терминальная часть/точка остановки/условие выхода) — условие, при котором рекурсия завершается и функция возвращает результат без дальнейших вызовов. Без него возникает бесконечная рекурсия и переполнение стека.
  • Рекурсивный шаг (вложенный вызов) — вызов функции внутри себя с изменёнными параметрами, приближающий задачу к базовому случаю.
  • Глубина рекурсии — количество вложенных вызовов функции или процедуры.
  • Стек вызовов — структура памяти, где хранятся активные вызовы функции (их параметры, локальные переменные, адрес возврата). При каждом рекурсивном вызове в стек сохраняются переменные функции и адрес возврата. Это позволяет каждому следующему вызову пользоваться своим набором локальных переменных. При достижении базового случая стек «сворачивается»: значения возвращаются в обратном порядке, формируя итоговый результат. Реализация рекурсии в большинстве языков программирования опирается на данный механизм. Однако при чрезмерно большой глубине рекурсии может наступить переполнение стека.
  • Прямой ход рекурсии — этап выполнения рекурсивной функции, во время которого функция многократно вызывает саму себя с изменёнными параметрами, пока не будет достигнут базовый случай.
  • Обратный ход рекурсии — этап выполнения рекурсивной функции, который начинается после достижения базового случая и заключается в последовательном возврате значений и завершении ранее приостановленных вызовов функции.
  • Декомпозиция задачи — процесс разбиения сложной задачи на более простые подзадачи (имеющих ту же структуру, что и исходная задача, но меньшего размера), решения которых затем объединяются для получения итогового результата.

Виды рекурсии

Рекурсию можно классифицировать по нескольким критериям[2][4][5]:

Критерий Виды
По структуре данных
По числу подзадач
По положению вызова
  • хвостовая (англ. tail recursion): вызов — последняя операция; может быть оптимизирована до итерации;
  • нехвостовая: после возврата требуется дополнительная работа
По схеме вызовов
  • прямая (функция вызывает себя);
  • косвенная (функция вызывает , а  — )
По целям

Также выделяют анонимную рекурсию — рекурсию с использованием неявных реализаций функций или процедур (лямбда-функции и подобные им механизмы)[5].

Примеры рекурсивных алгоритмов

Примеры кода (псевдокод)[4][6][7][8]:

  • Вычисление факториала: , базовый случай — .
function factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)
memo = {}
function fib(n):
    if n in memo:
        return memo[n]
    if n <= 1:
        return n
    memo[n] = fib(n-1) + fib(n-2)
    return memo[n]
function inorder(node):
    if node is not null:
        inorder(node.left)
        print(node.value)
        inorder(node.right)

Применение

Применение рекурсивных алгоритмов эффективно, если задача:

  • естественным образом разбивается на подзадачи того же типа (индуктивная структура);
  • имеет древовидную или иерархическую природу (деревья, графы, вложенные списки);
  • решается по принципу «разделяй и властвуй» (сортировки, поиск);
  • требует обхода в глубину или с возвратом (backtracking).

Чтобы избежать возможных проблем необходимо:

  • Чётко определить базовый случай и убедиться, что все ветви рекурсии его достигают.
  • Доказать убывание меры (например, длины списка, глубины дерева) на каждом шаге.
  • Использовать мемоизацию (кэширование результатов) для задач с повторяющимися подвызовами.
  • Ограничить глубину рекурсии, если это возможно, или рассмотреть итеративную альтернативу.
  • Избегать побочных эффектов — использовать чистые функции без разделяемого состояния.
  • Оптимизировать хвостовую рекурсию, если язык/компилятор поддерживает такую оптимизацию.

Выбор между рекурсией и итерацией

В ряде случаев итеративный метод будет эффективнее, поэтому выбор между рекурсией и итерацией — это баланс между простотой кода и ограничениями ресурсов[9][3].

Критерий Рекурсия Итерация
Читаемость Лучше для вложенных структур Может быть громоздкой
Память Выше (стек вызовов) Ниже (нет накладных расходов)
Скорость Чаще медленнее Чаще быстрее
Сложность реализации Проще для рекурсивных структур Проще для линейных задач
Риск переполнения стека Есть Нет

Когда выбрать рекурсию[3]:

  • задача имеет естественную рекурсивную структуру (деревья, графы);
  • важна читаемость и компактность кода;
  • глубина рекурсии невелика или контролируема.

Когда выбрать итерацию[10]:

  • задача линейна (сумма массива, поиск);
  • критична производительность или память;
  • глубина рекурсии может быть большой.

Примечания

  1. Босова Л.Л., Босова А.Ю. Рекурсивные алгоритмы. Разработка алгоритмов и программ. bosova.ru. Дата обращения: 13 февраля 2026.
  2. 1 2 Рекурсивный алгоритм. repetitor.1c.ru. Дата обращения: 13 февраля 2026.
  3. 1 2 3 Рекурсивные алгоритмы. el-ed.ru (16 мая 2025). Дата обращения: 14 февраля 2026.
  4. 1 2 Рубио-Санчес М. Введение в рекурсивное программирование. — М.: ДМК Пресс, 2019. — С. 19—23. — 438 с. — ISBN 978-5-97060-703-9.
  5. 1 2 Алгоритмы. Рекурсия. Реализация в Python и Java. www.kaznu.kz. Дата обращения: 14 февраля 2026.
  6. Алексей Толстиков, Александр Куликов. 6.4 Рекурсивные алгоритмы. education.yandex.ru. Дата обращения: 15 февраля 2026.
  7. Веселова Александра Викторовна. Рекурсивные алгоритмы. Разложение натурального числа на слагаемые и множители. nsportal.ru (30 ноября 2019). Дата обращения: 15 февраля 2026.
  8. Свейгарт Эл. Рекурсивная книга о рекурсии (Серия Библиотека программиста). — СПб., М, Минск: Питер, 2023. — 336 с. — ISBN 978-1718502024. — ISBN 978-5-4461-2393-3.
  9. Поляков К. Ю., Еремин Е. А. Информатика. 10 класс. Углубленный уровень: в 2 ч. Ч 2.. — М.: Бином, 2013. — С. 164. — 304 с. — ISBN 978-5-9963-1417-1. — ISBN 978-5-9963-1152-1.
  10. Александра Умнова. Рекурсия — что такое. skyeng.ru (30 октября 2025). Дата обращения: 15 февраля 2026.