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)
将
fib()
的结果转换为列表,并将其索引到-1
:一种简单的方法是生成所有n斐波那契数并返回花费
O(n)
时间的最后一个元素。您可以使用Binet's Formula.比奈公式:
^{pr1}$在哪里
Phi=(1+√5)/2= and -Phi=(1-√5)/2
(1+√5)/2
也称为Golden Ratio.数学证明与计算器
可以使用带memoization的递归计算第n个斐波那契数
为什么?
例如:假设您要计算
fibonacci(5)
,那么您需要计算fibonacci(4)
和fibonacci(3)
。但是现在,对于fibonacci(4)
,您需要计算fibonacci(3)
和fibonacci(2)
,依此类推。但是等等,当您完成计算fibonacci(4)
分支时,您已经计算了3和2的所有斐波那契,因此当您从第一个递归调用返回到另一个分支(fibonacci(3)
)时,您已经计算了它。那么,如果有一种方法可以存储这些计算,以便更快地访问它们呢?您可以使用Decorators创建memoize类(某种内存以避免重复计算):这样,我们将把
fibonacci(k)
的每次计算都存储在dict
上,每次调用之前我们都会检查它是否存在于字典中,如果True
返回,或者计算它。这种方法更快、更准确输出:
只花了
0.2716239
秒相关问题 更多 >
编程相关推荐