В обычном Python хвостовые вызовы не устраняют кадры функции: рекурсия накапливает стек и может завершиться RecursionError. Гвидо связывал отказ от такой оптимизации прежде всего с прозрачной отладкой.
Как устроен механизм оптимизации хвостовой рекурсии в Python? Почему Гвидо ван Россум принципиально отказался от его внедрения и к каким последствиям для стека вызовов это приводит?
В обычном Python хвостовые вызовы не устраняют кадры функции: рекурсия накапливает стек и может завершиться RecursionError. Гвидо связывал отказ от такой оптимизации прежде всего с прозрачной отладкой.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В обычном Python хвостовые вызовы не устраняют кадры функции: рекурсия накапливает стек и может завершиться RecursionError. Гвидо связывал отказ от такой оптимизации прежде всего с прозрачной отладкой.
При хвостовом вызове результат рекурсивной функции сразу возвращается, но Python всё равно сохраняет цепочку вызовов. Устранение кадров изменило бы traceback и сделало бы поведение программ зависимым от наличия такой возможности в реализации. Для длинного линейного обхода обычно пишут цикл; для дерева можно использовать явный стек. Повышение лимита рекурсии не превращает рекурсивный алгоритм в итеративный и не устраняет расход памяти.
Источник: neopythonic.blogspot.com.