Python代码不理解
题目描述
原来在计算斐波那契数时,效率太低,现在,我们将在其中存储斐波那契数。
当计算斐波那契数时,我们首先在缓存中查找它,如果它不在那里,
我们计算它并将它放入缓存,否则我们返回缓存的数。
看不懂memoized(f)
相关代码
def memoized(f): cache = {}
def wrapped(k):
v = cache.get(k)
if v is None:
v = cache[k] = f(k)
return v
return wrapped
@memoized
def fibonacci(n):
if n in [0, 1]:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
回答:
搜索了解一下python闭包跟装饰器。
memoized是一个装饰器,也就是闭包,它实现的功能是调用fibonacci函数之前,先检查自己的缓存中有没有现成的值,有就直接返回省去重复计算,没有就计算一次并缓存。
另外说一句,你这个斐波那契优化方法不是最佳的,因为你只缓存了你访问到的数值。比如你先求了第1000个斐波那契数,然后第一次求第800个的时候还是要一路递归计算。
其实第n个斐波那契数依赖于第n-1和n-2个斐波那契数,在计算任一斐波那契数的时候,应该把它前面的斐波那契数列按顺序都缓存好,这样以后取n以内的任意斐波那契数都不用计算了。
以上是 Python代码不理解 的全部内容, 来源链接: utcz.com/p/938027.html