我不知道这个算法中的数学,可以使用一些帮助。
算法:
if n<2 then
return n
else return fibonacci(n-1) + fibonacci(n-2)
声明
n&lt; 2是O(1)
时间n> = 2是O(1)
返回n是O(1)
时间n> = 2是 -
返回fib(n-1)+ fib(n-2)是 -
且时间n> = 2是T(n-1)+ T(n-2)+ O(1)
总计:O(1)T(n-1)+ T(n-2)+ O(1)答案 0 :(得分:4)
我认为你应该注意到这个函数的递归关系非常熟悉。通过按名称查找,您可以准确了解非常熟悉的重现的增长速度。
但是,如果您没有实现直观的飞跃,您可以尝试使用简化的问题绑定运行时。实质上,您可以通过保证增加运行时的方式修改算法,同时使其更简单。然后你弄清楚新算法的运行时间,它给你一个上限。
例如,此算法必须花费更长时间并且分析起来更简单:
F(n): if n<2 then return n else return F(n-1) + F(n-1)
答案 1 :(得分:3)
通过归纳:如果fib(k)
的计算对于所有C*2^k
的{{1}}小于k < n
,则对于fib(n)
的计算大小我们已经
T(n) = T(n-1) + T(n-2) + K < C*2^(n-1) + С*2^(n-2) + K
= 0.75*C*2^n + K < C*2^n
足够大C
(C > K/0.25
,2^n > 1
)。这证明T(n) < C*2^n
,即T(n) = O(2^n)
。
(此处T(n)
是计算fib(n)
的时间,K
是fib(n)
和{{1}时计算fib(n-1)
所需的常量时间已经[已经]计算了。)
答案 2 :(得分:0)
你需要解决递推方程:
T(0) = 1
T(1) = 1
T(n) = T(n-1) + T(n-2), for all n > 1