Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm fibonacci数的递归求解_Algorithm_Fibonacci - Fatal编程技术网

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。对-答案就在你面前,特别是如果你知道斐波那契数增长有多快的话!