我写了一个函数,计算斐波那契数列的第n项数值
def fib_n(x):
s=[0,1]
if x<=1:
return s[x]
else:
k=2
while (k<=x):
m=s[k-2]+s[k-1]
s.append(m)
k=k+1
return s[x]
但是报出占用的空间比较大,有另外一种计算方法是:
def Fibonacci(self, n):
# write code here
if n == 0:
return 0
if n == 1:
return 1
if n == 2:
return 1
if n >= 3:
s = []*n
s.append(1)
s.append(1)
for i in xrange(2,n):
s.append(s[i-1]+s[i-2])
return s[n-1]
我想问下,第二种为什么占用空间比较小。
我知道这个问题可能比较简单,如果哪位愿意指教,可以告诉我一下,这是哪一部分知识缺乏?
首先你写的函数时间空间效率不是很高。
至于空间的问题我暂时看出来的是第一种总会创建s变量,第二种在n<3的情况下不会。
我的建议是这种写法(Python3)。
其中lru_cache是Python自带的利用LRU算法的缓存模块,意思就是算过的fib(n)(最近计算过的10000个之内)会缓存下来,直接使用,整体上和使用循环效率一致。