Вопрос проверяет понимание рекурсии как приёма программирования, её ограничений и умение переписывать рекурсивные решения в итеративные.
Рекурсия — это приём, когда функция вызывает саму себя для решения подзадач. Она делает код короче и понятнее для задач с естественной рекурсивной структурой, например для деревьев. Основные недостатки — риск переполнения стека вызовов и дополнительный расход памяти. От рекурсии можно избавиться, переписав алгоритм через цикл или используя собственный стек данных. В Python рекурсия используется осторожно из-за ограничения глубины.
Рекурсия часто используется для описания задач, которые естественно делятся на более простые версии самих себя.
Определение: Рекурсия — это подход, при котором функция решает задачу, вызывая саму себя с более простыми входными данными, пока не будет достигнуто базовое условие.
Любая корректная рекурсия включает:
Базовый случай — условие, при котором рекурсивные вызовы прекращаются
Рекурсивный шаг — переход к более простой подзадаче
Пример факториала:
def factorial(n):
if n == 0: # базовый случай
return 1
return n * factorial(n - 1) # рекурсивный шаг
Рекурсия удобна в задачах со вложенной структурой:
Деревья и графы
Разбор выражений
Алгоритмы «разделяй и властвуй»
Плюсы:
Код часто короче и читаемее
Логика близка к математическому описанию
Рекурсия имеет и серьёзные минусы:
Каждый вызов занимает место в стеке
В Python есть ограничение глубины рекурсии (RecursionError)
Иногда сложнее отлаживать
Когда рекурсия становится проблемой, есть несколько подходов.
Многие рекурсивные алгоритмы легко переписываются в итеративные:
def factorial_iter(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
Подходит для обхода деревьев или графов:
stack = [root]
while stack:
node = stack.pop()
# обработка node
# добавление детей в stack
В Python она не оптимизируется, но иногда упрощает логику:
def fact_tail(n, acc=1):
if n == 0:
return acc
return fact_tail(n - 1, acc * n)
Рекурсия удобна для задач с естественной вложенной структурой.
В Python для больших входных данных чаще используют итеративные решения или собственный стек.