Глубина рекурсии и кэш
Глубина рекурсии
Напишем функцию, которая ищет n-ый член арифметической прогрессии с первым элементом равным 1 и шагом 1.
def f(n):
if(n==1):
return 1
if(n>1):
return f(n-1)+1
Допустим нам нужно посчитать f(500), программа будет работать следующим образом f(500)=f(499)+1=f(498)+2=f(497)+3=...=f(2)+498=f(1)+499=500, таких шагов мы выполним 500 штук. Это количество шагов и является глубиной рекурсии. По умолчанию в python максимально возможная глубина рекурсии равна 1000, если верить документации. Некоторые задания требуют глубины, которая больше, чем установлена в python по умолчанию.
В этом случае мы можем увидеть следующий текст ошибки:
RecursionError: maximum recursion depth exceeded in comparison
Для решения этой проблемы у нас есть возможность изменить глубину рекурсии в каждом отдельном случае. Для этого добавим первые две строчки к нашей программе
from sys import *
setrecursionlimit(2000)
Где 2000 - необходимая для нашей задачи глубина рекурсии.
Кэш
Реализуем функцию, которая находит числа Фибоначчи.
def f(n):
if(n==0):
return 0
if(n==1 or n==2):
return 1
if(n>2):
return f(n-1)+f(n-2)
Допустим, что мы вызываем f(6). f(6)=f(5)+f(4), т.е. для того, чтобы знать f(6) нам нужно знать f(5) и f(4). f(5)=f(4)+f(3) и т.д. Изобразим процесс вызова в виде графа.
from functools import *
@lru_cache
def f(n):
...