试图显示斐波那契的递归调用次数等于 Big O
Trying to show number of recursive calls for fibonacci is equal to Big O
我有这个代码来计算递归调用的次数,并显示它大约等于 O(2^n),正如众所周知的斐波那契数;
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int c=0;
int fib(int n) {
c++;
if (0 == n) { return 0;}
if (2 >= n) {
return 1;
}
return fib(n-1) + fib(n-2);
}
int main(int argc, char * argv[]) {
int i;
for(i = 1 ; i < 10 ; i++) {
c=0;
int f=fib(i);
printf("fib(%d) = %d,\tc = %d,\t2^%d = %f\n", i, f, c, i, pow(2,i));
}
return 0;
}
这是输出;
fib(1) = 1, c = 1, 2^1 = 2.000000
fib(2) = 1, c = 1, 2^2 = 4.000000
fib(3) = 2, c = 3, 2^3 = 8.000000
fib(4) = 3, c = 5, 2^4 = 16.000000
fib(5) = 5, c = 9, 2^5 = 32.000000
fib(6) = 8, c = 15, 2^6 = 64.000000
fib(7) = 13, c = 25, 2^7 = 128.000000
fib(8) = 21, c = 41, 2^8 = 256.000000
fib(9) = 34, c = 67, 2^9 = 512.000000
这是怎么回事?
如果我没理解错的话,您想知道为什么 c
的值和相应的值 2ⁿ
没有您预期的那么接近。
原因是调用树不平衡,所以 O(2ⁿ)
只是一个松散的上限。调用次数的下限为 Ω(2<sup>n/2</sup>)
.
如图所示:您为 n=6
计算的数字是正确的。也可以看到调用树不平衡
我有这个代码来计算递归调用的次数,并显示它大约等于 O(2^n),正如众所周知的斐波那契数;
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int c=0;
int fib(int n) {
c++;
if (0 == n) { return 0;}
if (2 >= n) {
return 1;
}
return fib(n-1) + fib(n-2);
}
int main(int argc, char * argv[]) {
int i;
for(i = 1 ; i < 10 ; i++) {
c=0;
int f=fib(i);
printf("fib(%d) = %d,\tc = %d,\t2^%d = %f\n", i, f, c, i, pow(2,i));
}
return 0;
}
这是输出;
fib(1) = 1, c = 1, 2^1 = 2.000000
fib(2) = 1, c = 1, 2^2 = 4.000000
fib(3) = 2, c = 3, 2^3 = 8.000000
fib(4) = 3, c = 5, 2^4 = 16.000000
fib(5) = 5, c = 9, 2^5 = 32.000000
fib(6) = 8, c = 15, 2^6 = 64.000000
fib(7) = 13, c = 25, 2^7 = 128.000000
fib(8) = 21, c = 41, 2^8 = 256.000000
fib(9) = 34, c = 67, 2^9 = 512.000000
这是怎么回事?
如果我没理解错的话,您想知道为什么 c
的值和相应的值 2ⁿ
没有您预期的那么接近。
原因是调用树不平衡,所以 O(2ⁿ)
只是一个松散的上限。调用次数的下限为 Ω(2<sup>n/2</sup>)
.
如图所示:您为 n=6
计算的数字是正确的。也可以看到调用树不平衡