Вы можете вычислить число N-го Фибоначчи, используя рекурсию с памяткой
Почему?
Например: представьте, что вы должны вычислять fibonacci(5)
, поэтому вам нужно вычислить fibonacci(4)
и fibonacci(3)
. Но теперь для fibonacci(4)
вам нужно вычислить fibonacci(3)
и fibonacci(2)
и так далее. Но подождите, когда вы закончите sh вычисления fibonacci(4)
ветви, вы уже вычислили все Фибоначчи для 3 и 2, поэтому, когда вы go вернетесь к другой ветви (fibonacci(3)
) из первого рекурсивного вызова, вы уже вычислили Это. Итак, что, если есть способ сохранить эти вычисления, чтобы я мог получить к ним доступ быстрее? Вы можете сделать это с помощью Decorators , чтобы создать класс memoize (своего рода память, чтобы избежать повторных вычислений):
Таким образом, мы будем хранить каждое вычисление fibonacci(k)
для dict
, и мы будем каждый раз перед вызовом проверять, существует ли он в словаре, возвращать, если True
, или вычислять его. Этот способ быстрее и точнее.
class memoize:
def __init__(self, function):
self.f = function
self.memory = {}
def __call__(self, *args):
if args in self.memory:
return self.memory[args]
else:
value = self.f(*args)
self.memory[args] = value
return value
@memoize
def fib(n):
if n <= 1:
return n
else:
return fib(n-1) + fib(n-2)
r = fib(300)
print(r)
Выходы:
222232244629420445529739893461909967206666939096499764990979600
Это заняло всего 0.2716239
сек.