Откройте матрёшку — внутри матрёшка поменьше, внутри неё ещё меньше, и так до самой крошечной, которую уже не открыть. РекурсияПриём, при котором функция вызывает саму себя. Нужен базовый случай, чтобы вызовы завершились. устроена так же: функцияИменованный блок кода, который можно вызывать многократно. Может принимать аргументы и возвращать результат. решает задачу, вызывая саму себя для задачи поменьше, и так до самого простого случая, который решается сразу.
У любой рекурсии есть две обязательные части:
Базовый случай — самая маленькая матрёшка, которая не открывается. Здесь рекурсия останавливается.
Шаг рекурсии — вызов самой себя для задачи поменьше, приближающий к базовому случаю.
▶ countdown.py
Проследим вызовы: countdown(3) печатает 3 и зовёт countdown(2), тот печатает 2 и зовёт countdown(1), далее countdown(0) — это базовый случай, он печатает «Пуск!» и возвращается, не вызывая себя. Стопка вызовов «схлопывается» обратно.
🚫Внимание
Без базового случая рекурсия бесконечна. Если функция всегда зовёт себя и никогда не останавливается, Python досчитает до предела глубины вызовов и упадёт с ошибкой RecursionError. Базовый случай так же обязателен, как условие выхода у while.
Факториал — классика рекурсии
Факториал числа n (записывается n!) — это произведение всех чисел от 1 до n. Например, 4! = 4·3·2·1 = 24. Рекурсивное определение элегантно: n! = n · (n−1)!, а 0! = 1 (это базовый случай).
▶ factorial.py
Как разворачивается factorial(4): оно ждёт factorial(3), тот ждёт factorial(2), и так до factorial(0), которое возвращает 1. Затем результаты перемножаются на обратном пути: 1 → 1·1 → 2·1 → 3·2 → 4·6 = 24.
💡Совет
Предскажите вывод. Что вернёт summa(3) ниже? Подсказка: функция складывает n с суммой чисел поменьше, база — ноль.
▶ predict-sum.py
Вернётся 6: это 3 + 2 + 1 + 0. Функция считает сумму чисел от 1 до n рекурсивно — каждый вызов добавляет своё n к сумме оставшихся.
⚠️ Частые ошибки новичков
Ошибка. Забыть базовый случай. Без него функция вызывает себя бесконечно. Запустите код ниже — увидите RecursionError: maximum recursion depth exceeded. Почините: добавьте в начало if n == 0: return 0.
▶ broken-recursion.py
Заданиерешение.py
Напишите рекурсивную функцию power(base, exp), которая возводит base в степень exp (для целого exp ≥ 0). База: любое число в степени 0 равно 1.
Заданиерешение.py
Напишите рекурсивную функцию count_down(n), которая возвращает список чисел от n до 1 включительно. Например, count_down(3) → [3, 2, 1]. База: при n == 0 вернуть пустой список.
❓Проверь себя
Что такое базовый случай в рекурсии?
Что произойдёт, если в рекурсии нет базового случая?
Чему равен factorial(0) в классическом определении?
ℹ️Важно
✅ Что вы узнали
Рекурсия — функция вызывает саму себя для задачи поменьше.
Обязательны базовый случай (стоп) и шаг (вызов себя).
Факториал: n! = n · (n−1)!, база 0! = 1.
Без базового случая — RecursionError.
Результаты собираются на «обратном пути» из вызовов.
Комментарии
Загрузка…
Загрузка комментариев…