count = 0
def fibonacci(n):
global count
count = count + 1
if not isinstance(n, int):
print ('Invalid Input')
return None
if n < 0:
print ('Invalid Input')
return None
if n == 0:
return 0
if n == 1:
return 1
fib = fibonacci(n-1) + fibonacci(n-2)
return fib
fibonacci(8)
print(count)
我试图找出这个斐波纳契计划的运行时间。任何人都可以帮我解决相同的递归关系..
T(n)= T(n-1)+ T(n-2)......这里的运行时间计算是什么?
谢谢...:)
答案 0 :(得分:1)
我假设你的意思是'斐波那契',你说的是'阶乘'。
在每个级别,您有两次拨打fibonacci()
。这意味着您的运行时间将为O(2 ^ n)。你可以通过绘制递归树来看到这一点。
有关更好更详细的说明,请参阅Computational complexity of Fibonacci Sequence。
答案 1 :(得分:0)
看看this,特别是time.clock()。在函数调用之前和之后调用时钟,计算差值并获得经过的时间。
顺便问一下:为什么斐波纳契的代码如此之多?def fib (n): return fib (n - 1) + fib (n - 2) if n > 1 else n
答案 2 :(得分:0)
你可以看到wiki, 但简单的观察正如你所写:
T(n) < 2T(n-1) = 2 * 2 T(n-2) =.... = 2^(n-1)T(1) = 2^(n-1). So T(n) is in O(2^n).
实际上你应该解决x^2 = X + 1
因此x将是phi1 = (1+sqrt(5))/2
或phi2 = (1-sqrt(5))/2
所以结果是phi1 ^ n + phi2 ^n
但是因为大{n} phi2
小于1我们可以说它是T(n)=phi1^n
。
编辑: *但您可以编辑当前的解决方案以获取O(n)运行时间(从第一个元素开始循环)。
答案 3 :(得分:0)
运行时是2F(n + 1) - 1次调用,其中n是第n个Fibonacci数。
这是一个快速归纳证明:
作为基本情况,如果n = 0或n = 1,那么我们只进行一次调用,并且F(1)= F(2)= 1,我们得到2F(n + 1) - 1 = 1。
对于归纳步骤,如果n> 1,然后我们进行尽可能多的调用以评估n-1和n-2上的函数。通过归纳假设,这需要2F(n)-1 + 2F(n-1)-1 = 2F(n + 1) - 2个递归调用来完成。但是,因为我们也计算当前的函数调用,所以我们在其中添加一个以获得2F(n + 1) - 1的所需。
注意2F(n + 1) - 1是第n个Leonardo数的表达式,其中
L(0)= L(1)= 1
L(n + 2)= L(n)+ L(n + 1)+ 1
Saeed指出,它生长在Θ(Φ n )。但是,这个答案在数学上是精确的。
这更准确地说是您感兴趣的运行时,因为您需要考虑每个递归调用本身正在完成的工作。如果你放弃+1术语,你就可以获得斐波那契系列的作品!