Информатика · 10 класс3 четвертьТема 5ГОСО РК 2026Базовый

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

Понятие рекурсии, прямой и косвенный вызов, базовый случай (условие остановки), глубина рекурсии, факториал и числа Фибоначчи.

Время изучения~60 минтеория + практика
Разделы темы4 разд.пошаговый разбор
Тест темы3 вопр.с мгновенным ответом
СОР / СОЧ3 четвертьдескрипторы ГОСО

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

В реальном мире примеры рекурсии встречаются повсюду:

• Два зеркала, поставленные друг напротив друга, образуют бесконечный коридор отражений;

• Эффект Дросте — на картине нарисована женщина, держащая ту же самую картину, на которой нарисована женщина...;

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

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

Парадигма

Рекурсия

Вызов функции из тела самой себя для решения подзадачи меньшего размера.
Математика

Фрактал

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

Любая корректная рекурсивная функция обязана состоять из двух непременных частей:

1. Базовый случай (условие остановки / тривиальный случай):

Условие, при котором функция НЕ вызывает саму себя, а сразу возвращает готовое числовое значение без рекурсии. Это аварийный тормоз, предотвращающий бесконечный цикл вызовов;

2. Шаг рекурсии (рекурсивный спуск):

Ветка алгоритма, где функция вызывает саму себя, но ОБЯЗАТЕЛЬНО с параметром, который приближает задачу к базовому случаю (например, уменьшает аргумент n на 1: f(n - 1)).

Классический пример — вычисление факториала n!=n⋅(n−1)!n! = n \cdot (n - 1)!:

def factorial(n):

if n <= 1: # 1. Базовый случай

return 1

return n * factorial(n - 1) # 2. Шаг рекурсии

Обязательно

Базовый случай

Условие немедленного возврата значения, останавливающее цепь рекурсивных вызовов.
Шаг

Редукция задачи

Уменьшение размерности входных данных при каждом следующем вызове функции.

Переполнение стека

Если забыть базовый случай, программа упадет с критической ошибкой RecursionError: maximum recursion depth exceeded (в Python лимит глубины рекурсии по умолчанию равен 1000 вызовов).

Когда функция вызывает саму себя, операционная система сохраняет в специальной области оперативной памяти — стеке вызовов (Call Stack) — состояние текущей функции: адрес возврата и значения локальных переменных.

Процесс выполнения factorial(3):

1. factorial(3) приостанавливается и запрашивает factorial(2) — кадр кладется в стек;

2. factorial(2) приостанавливается и запрашивает factorial(1) — второй кадр в стек;

3. factorial(1) доходит до базового случая n <= 1 и мгновенно возвращает 1 (вершина рекурсивного спуска);

4. Начинается рекурсивный подъем: управление возвращается в factorial(2), который вычисляет 2 · 1 = 2 и выталкивается из стека;

5. Управление возвращается в factorial(3), который считает 3 · 2 = 6 и выдает финальный ответ.

Память ЭВМ

Стек вызовов (Call Stack)

Структура памяти LIFO (Last In — First Out) для хранения цепочки вложенных вызовов функций.

Ряд Фибоначчи: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34...

Каждое следующее число равно сумме двух предыдущих: F(n)=F(n−1)+F(n−2)F(n) = F(n-1) + F(n-2).

Наивная рекурсивная функция:

def fib(n):

ifn<=1if n <= 1:

return n

return fib(n - 1) + fib(n - 2)

ПРОБЛЕМА: дерево вызовов разрастается с экспоненциальной скоростью O(2n)O(2^n). Например, при вызове fib(40) функция вычисляется миллиарды раз, многократно решая одни и те же подзадачи. Для эффективного решения применяют динамическое программирование (мемоизацию) или обычный цикл for за время O(n)O(n).

Шаг 1
Определение базового случая
if n <= 1: return n.
Шаг 2
Рекурсивное ветвление
return fib(n - 1) + fib(n - 2).
Шаг 3
Мемоизация (оптимизация)
Использовать декоратор @functools.lrucache() для кэширования повторных результатов.
Ваш прогресс по теме25%
Шпаргалка формул10 класс
Объем растрового графического изображения:
I=X⋅Y⋅iI = X \cdot Y \cdot i[бит (байт)]
Количество цветов в палитре растрового изображения:
Kцветов=2iK_{цветов} = 2^i[цветов]
Объем цифрового несжатого аудиофайла (PCM):
I=ν⋅b⋅t⋅kI = \nu \cdot b \cdot t \cdot k[бит]
Временная сложность бинарного поиска:
T(n)=O(log⁡2n)T(n) = O(\log_2 n)[операций]
Следующая тема

Алгоритмы сортировки и поиска: Bubble Sort, Selection Sort и бинарный поиск

Перейти к теме →