Вы получаете исключение, потому что 30 000 кадров стека - это довольно большое число: -)
Вы решаете , используя рекурсию более осмотрительным образом.Идеальными задачами, которые необходимо решить рекурсивно, являются те, которые быстро сокращают «пространство поиска» (a) .
Например, обход двоичного дерева, когда пространство поиска уменьшается вдвое каждый раз, когда вы повторяетесь:
def find (searchkey, node):
if node = NULL:
return NULL
if searchkey = node.key:
return node
if searchkey < node.key:
return find (searchkey, node.left)
return find (searchkey, node.right)
Добавление двух целых чисел без знака (и ваш собственный алгоритм выше) не хорошо подходит для рекурсии, потому что вы выбрасываете свое распределение стека задолго до вычисления результатов .:
def add (a, b):
if a = 0:
return b
return add (a-1, b+1)
(a) Пространство поиска можно определить как весь ваш набор возможных ответов.Вы хотите уменьшить его как можно быстрее.
И, кроме того, идеальные задачи для рекурсии не имеют ничего общего с пространством стека в теоретическом / математическом смысле, это просто любая проблема, которая может бытьвыражается как:
- та же или аналогичная проблема с «более простым» аргументом.
- завершающее условие с «самым простым» аргументом.
(«простой» в этом смысле означает приближение к завершающему условию).
Теоретические / математические подходы не должны были бы учитывать пространство стека, но мы, как компьютерные специалисты, должны.Реальность устанавливает пределы: -)
См. Также Когда бы я не использовал рекурсию? и Ситуации, когда вы хотите преобразовать рекурсию в итерацию .