Maximum recursion depth exceeded in comparison

def F(n):
    if n<3:
        return n + 1
    if n >= 3:
        if n%2==0:
            return n + 2*F(n+2)
        else:
            return F(n-2) + n - 2
c = 0
for i in range(1,10000):
    s = str(F(i))
    if len(s) == 3:
        c += 1
print(c)

Вывод программы:

File "main.py", line 6, in F
return n + 2F(n+2)
File "main.py", line 6, in F
return n + 2
F(n+2)
File "main.py", line 6, in F
return n + 2F(n+2)
File "main.py", line 6, in F
return n + 2
F(n+2)
File "main.py", line 6, in F
return n + 2F(n+2)
File "main.py", line 6, in F
return n + 2
F(n+2)
File "main.py", line 6, in F
return n + 2F(n+2)
File "main.py", line 6, in F
return n + 2
F(n+2)
File "main.py", line 6, in F
return n + 2*F(n+2)
File "main.py", line 2, in F
if n<3:
RuntimeError: maximum recursion depth exceeded in comparison


Ответы (2 шт):

Автор решения: passant

Причина указана прямо в тексте ошибок.

Узнать заданное ограничение на глубину рекурсии можно так:

import sys
print(sys.getrecursionlimit()) 

Установить нужную вам - вот так:

sys.setrecursionlimit(lim_of_recr)

Но советую быть с этим параметром поосторожнее. Поэтому лучше править алгоритм, а не давать возможность углубляться в рекурсию.

→ Ссылка
Автор решения: Tarodictrl

Второе условие вызывает себя же в будущем. Поэтому если оно четно, то оно вызовет еще одну четную функцию, а она еще одну, т.е. так и не посчитает значение никогда. Решается, дописав 10 строку:

def F(n):
    if n<3:
        return n + 1
    if n >= 3 and n%2==0:
            return n + 2*F(n+2)
    if n >= 3 and n%2!=0:
            return F(n-2) + n - 2
c = 0
for i in range (1,100):
    if i%2!=0:
        s = str(F(i))
        if len(s) == 3:
            c += 1
print(c)
→ Ссылка