我被朋友挑战在python中构建一个高效的Fibonacci函数。所以我开始测试不同的递归方式(我没有很高的数学技能来考虑复杂的算法,请不要向我展示一个有效的Fibonacci函数,这不是问题)
然后我尝试了两种不同的解决方案:
解决方案1:
def fibo(n):
if n > 1:
return fibo(n-1)+fibo(n-2)
return 1
解决方案2:
def fibo(n):
if n < 1:
return 1
return fibo(n-1)+fibo(n-2)
然后,我为每个人运行了这个:
res = map(fibo, range(35))
print res
现在,我怀疑可能存在效率差异(我不能确切地说为什么)。但我预计会有一点不同。结果彻底击败了我。差异是巨大。第一个花了7.5秒,而第二个花费了惊人的12.7(几乎是两次!)。
任何人都可以向我解释原因吗?那些基本上不一样吗?
答案 0 :(得分:13)
(not n > 1)
为(n <= 1)
,使用<=
重新运行第二个代码,您会看到类似的时间:
In [1]: def fibo(n):
....: if n <= 1:
....: return 1
....: return fibo(n-1)+fibo(n-2)
....:
In [2]: %timeit map(fibo, range(10))
10000 loops, best of 3: 29.2 us per loop
In [3]: def fibo(n):
....: if n > 1:
....: return fibo(n-1)+fibo(n-2)
....: return 1
....:
In [4]: %timeit map(fibo, range(10))
10000 loops, best of 3: 29.9 us per loop
如果您想知道为什么这会产生如此巨大的差异,当您运行map(fibo, range(35))
时,您14930351
会有fibo(1)
次来电。使用(n < 1)
,每个fibo(1)
将进行两次函数调用(fibo(0)
和fibo(-1)
)并对结果进行求和,进行相当多的操作!
答案 1 :(得分:8)
这些基本上不一样吗?
第二个功能是计算更高的斐波那契数,所以自然需要更长的时间:
>>> def fibo(n):
... if n > 1:
... return fibo(n-1)+fibo(n-2)
... return 1
...
>>> fibo(10)
89
>>> def fibo(n):
... if n < 1:
... return 1
... return fibo(n-1)+fibo(n-2)
...
>>> fibo(10)
144
您可能希望在第二个代码段中使用n <= 1
:
>>> def fibo(n):
... if n <= 1:
... return 1
... return fibo(n-1)+fibo(n-2)
...
>>> fibo(10)
89