База знаний для подготовки к ОГЭ и ЕГЭ, проверенная Российской академией наук

Рекурсия (ЕГЭ-ОГЭ)

Реку́рсия (программи́рование) — это способ описания объекта путём ссылки на самого себя.

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

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

Функции

В программировании под рекурсией понимают вызов функции (процедуры) самой себя — напрямую (простая рекурсия) или через другие функции (сложная или косвенная рекурсия). Например, функция вызывает функцию , а та, в свою очередь, обращается к функции . Число вложенных вызовов функции или процедуры называют глубиной рекурсии. Применение рекурсии позволяет описывать повторяющиеся или потенциально неограниченные вычисления без явного дублирования кода и без использования циклов.

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

undefined

Хвостовая рекурсия — специальный вид рекурсии, который при оптимизации компилятором может автоматически преобразовываться в итерацию. Это позволяет алгоритмам выполняться в ограниченном объёме памяти и предотвращает утечки памяти при формально бесконечных вычислениях. Тем не менее стандарты языков программирования не всегда однозначно определяют условия для такого преобразования.

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

Доказательство корректности программ

Для обоснования корректности рекурсивной функции необходимо доказать:

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

Данные

Под рекурсивным определением данных понимают ситуацию, когда структура данных (запись, объект) содержит вложенный объект, структурно аналогичный самому себе или, что встречается чаще, ссылку на такой же объект. Преимущество такого способа описания заключается в том, что одно конечное определение способно описать потенциально бесконечную структуру данных. Подобные конструкции применяются при представлении списков и графов.

Для обработки рекурсивных структур данных обычно применяются рекурсивные методы. В последнее время получила распространение концепция «ленивых вычислений», при которой значения вычисляются только по мере необходимости. Некоторые языки программирования (Python) поддерживают работу с потенциально бесконечными рекурсивными последовательностями без явных ограничений на создание объектов.

Пример (Pascal)

Ниже приведена рекурсивная функция на Pascal, вычисляющая факториал натурального числа. Факториал числа , обозначаемый , представляет собой произведение натуральных чисел от 1 до : 1⋅2⋅…⋅(n−1)⋅n.

function Factorial(n: integer): longint;

begin

if n = 1 then Factorial:= 1

else Factorial:= n*Factorial(n-1);

end;

Литература

  • Босова Л. Л., Босова А. Ю. Информатика. Базовый уровень: учебник для 11 класса. — М.: БИНОМ. Лаборатория знаний, 2017
  • Семакин И. Г., Шеина Т. Ю., Шестакова Л. В. Информатика и ИКТ. Профильный уровень: учебник для 11 класса. — М.: БИНОМ. Лаборатория знаний, 2012
  • Андреева Е. В., Программирование — это так просто, программирование — это так сложно. Современный учебник программирования. — М.: МЦНМО, 2015
  • Молчанова С. И. Основы программирования. Турбо-Паскаль 7.0 для школьников и абитуриентов. — М.: «Аквариум»; ООО «Фирма «Издательство АСТ», 1999

Категории