我的任务是对递归斐波那契算法进行分析。该算法具有O(2 ^ n)复杂度。我已经读过n是深度,而在另一篇文章中,n是2 ^ n的输入大小。那么真相是什么?然后如何计算步数(也许我们也可以称之为递归调用)来获得斐波那契数。我有这样的代码:
#include <bits/stdc++.h>
using namespace std;
long fibonacci(long);
long jl=0;
double rt;
int main(){
long result, number;
scanf("%ld", &number);
clock_t mulai = clock();
result = fibonacci(number);
rt = ((double) (clock() - mulai)) / CLOCKS_PER_SEC;
printf("Fibonacci (%ld) = %ld\n", number, result);
printf("Jumlah langkah = %ld\n", jl);
printf("Running Time = %.10f\n", rt);
return 0;
}
long fibonacci(long n){
jl++;
if(n==0 || n==1)
return n;
else
return fibonacci(n-1) + fibonacci(n-2);
}
这段代码中的jl是步数(递归调用)。这些是我的计算示例:
F(1),JL = 1
F(2),JL = 3
F(3),JL = 5
F(5),JL = 15
那么,这是真是假?如果为false什么是正确的代码?谢谢。
答案 0 :(得分:2)
这里的想法是,如果你要求实例fibonacci(3)
,你将需要进行一些递归调用。要想象我们可以绘制树,fibonacci(3)
调用fibonacci(3 - 1)
和fibonacci(3 - 2)
等。
fibonacci(3)
/ \
fibonacci(2) fibonacci(1)
/ \
fibonacci(0) fibonacci(1)
如果您需要计算fibonacci(4)
树成为
fibonacci(4)
/ \
fibonacci(3) fibonacci(2)
/ \ | \
fibonacci(2) fibonacci(1) fibonacci(1) fibonacci(0)
/ \
fibonacci(0) fibonacci(1)
你可能已经发现了模式,在最深处,树的深度为n。而节点数在O(2 ^ n)。
也就是说,如果你正在执行该函数,你将最多递减n级,但仍然执行~2 ^ n次函数调用。