Рекурсия - это инструмент.Иногда использование «инструмента рекурсии» облегчает чтение кода, хотя и не обязательно облегчает его понимание.
В общем, рекурсивные решения, как правило, являются хорошими кандидатами, когда подход «разделяй и властвуй» к решению конкретной задачипроблема естественная.
Как правило, рекурсия хорошо подходит, когда вы можете посмотреть на проблему и сказать «ага, если бы я знал ответ для более простого варианта этой проблемы, я мог бы использовать это решение для генерациия хочу ответить "и" самая простая из возможных проблем - это P, а ее решение - S ".Затем код для решения проблемы в целом сводится к просмотру внутренних данных, их упрощению, рекурсивному генерированию (более простого) ответа и переходу от более простого ответа к ответу в целом.
Если мы рассмотрим проблему подсчета уровней дерева, ответ таков: высота дерева на 1 больше, чем высота самого высокого / самого глубокого из детей, а высота листа равна 1. Что-то вродеследующий код.Эта проблема может быть решена итеративно, но, по сути, вы бы заново реализовали стек вызовов в своих собственных структурах данных.
def tree_height (tree):
if tree.is_leaf():
return 1
childmax = 0;
for child in tree.children():
childmax=max(childmax, tree_height(child))
return childmax+1
Стоит также учитывать, что оптимизация вызовов Tail может заставить некоторые рекурсивные функции выполняться впостоянное пространство стека.