【发布时间】:2017-04-30 04:29:58
【问题描述】:
我想计算为每个 n 调用 fib(n) 的次数。我写的代码如下:
#include <stdio.h>
#define N 10
int count[N + 1]; // count[n] keeps track of the number of times each fib(n) is called
int fib(int n) {
count[n]++;
if(n <= 1)
return n;
else
return fib(n - 1) + fib(n - 2);
}
int main() {
for(int i = 0; i <= N; i++) {
count[i] = 0; // initialize count to 0
}
fib(N);
// print values of count[]
for(int i = 0; i <= N; i++) {
printf("count[%d] = %d", i, count[i]);
}
}
我尝试打印数组 count[] 来获得结果,结果类似于斐波那契数,除了 count[0]:
count[0] = 34 count[1] = 55 count[2] = 34 count[3] = 21 count[4] = 13 计数[5] = 8 计数[6] = 5 计数[7] = 3 计数[8] = 2 计数[9] = 1 计数[10] = 1
有没有办法在数学上显示这个结果,也许是一个递归公式?另外,为什么 count[0] 或者 fib(0) 不继续斐波那契数列?谢谢。
【问题讨论】:
-
您已经进行了“优化”,其中
fib(1)不会调用fib(0)来获取结果 - 它直接返回1。只有fib(2)会调用它。因此,fib(0)没有像应有的那样频繁调用。另外,我不明白你的第一个问题