Хвостовая рекурсия
Хвостовая рекурсия — это рекурсия, при которой вызов функции самой себя выполняется последним действием перед завершением текущего вызова. После возвращения из рекурсивного вызова функции не нужно выполнять никаких дополнительных операций.
Как распознать
Хвостовая рекурсия является особым случаем рекурсивной функции. Сначала проверяют условие остановки — базовый случай. Затем функция изменяет параметры и вызывает себя снова. Если после этого вызова нет сложения, умножения, сравнения или другой обработки результата, рекурсия хвостовая.
Здесь \(p'\) — новые параметры функции. Важно, что результат рекурсивного вызова возвращается без изменений. Поэтому вычисление можно рассматривать как последовательное изменение состояния, а не как накопление отложенных операций.
Функция вычисляет сумму чисел от \(1\) до \(n\), передавая уже накопленную сумму в параметре \(s\). При \(n=0\) она возвращает \(s\). В рекурсивной ветви вызов sum(n - 1, s + n) стоит последним, поэтому рекурсия хвостовая.
def sum_tail(n, s=0): if n == 0: return s return sum_tail(n - 1, s + n)
Вызов return n + sum(n - 1) не является хвостовым: после возврата из sum нужно прибавить \(n\). Аналогично, в return 2 * f(n - 1) после рекурсивного вызова остаётся умножение. Такая структура связана с размером дерева рекурсивных вызовов, но сама по себе не гарантирует хвостовую рекурсию.
Какой фрагмент содержит хвостовую рекурсию?
Главное
- Хвостовая рекурсия заканчивается рекурсивным вызовом без последующих операций.
- Для распознавания ищите базовый случай и вызов функции, результат которого сразу возвращается.
return n + f(n - 1)— не хвостовая рекурсия, аreturn f(n - 1, ...)— хвостовая.