Algorithm fibonacci数的递归求解
我不知道这个算法的数学原理,需要一些帮助 算法:Algorithm fibonacci数的递归求解,algorithm,fibonacci,Algorithm,Fibonacci,我不知道这个算法的数学原理,需要一些帮助 算法: if n<2 then return n else return fibonacci(n-1) + fibonacci(n-2) 如果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) 如果n=2通过归纳法:如果计算所有k
if n<2 then
return n
else return fibonacci(n-1) + fibonacci(n-2)
如果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)
如果n<2
T(n)=T(n-1)+T(n-2)+O(1)如果n>=2通过归纳法:如果计算所有k的fib(n)
花费的时间小于C*2^k
,我们得到了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
T(n)=T(n-1)+T(n-2)+K
对于足够大的C
(对于C>K/0.25
,如2^n>1
)。这证明了T(n)
,即T(n)=O(2^n)
(此处T(n)
是计算fib(n)
的时间,K
是计算fib(n)
和fib(b-1)
都已计算时计算fib(n)
所需的恒定时间。)您需要求解递推方程:
T(0) = 1
T(1) = 1
T(n) = T(n-1) + T(n-2), for all n > 1
我想你应该注意到这个函数的递归关系非常熟悉。通过按名称查找,您可以确切了解这种非常熟悉的重复出现的增长速度
但是,如果您未能实现直观的飞跃,您可以尝试使用一个简化的问题来绑定运行时。从本质上讲,您修改算法的方式可以保证增加运行时间,同时使其更简单。然后计算出新算法的运行时间,这将为您提供一个上限
例如,此算法必须花费更长的时间且更易于分析:
F(n): if n<2 then return n else return F(n-1) + F(n-1)
F(n):如果函数中有两个递归调用。充其量,递归深度为n/2,等于2^kn(k=1/2)。我怀疑这还不够好——这就是为什么它只是一个评论,而不是一个答案。不过,我要说的是,Haskell的GHC将(我相信)通过记忆中间结果(隐式动态规划)自动优化这一点,给出O(n)。是的,我知道这不是Haskell语法。我的朋友,那很熟悉。。。别忘了t(1)=1。对-答案就在你面前,特别是如果你知道斐波那契数增长有多快的话!