如上所述,试图找出以下两个程序中的哪一个对于找到第n个Fibonacci数以及原因最有效。
Fibonacci数字是序列中的数字:1,1,2,3,5,8 ...其中前两个数字后面的每个数字是前两个数字的总和。
////迭代////
int main()
{
int n;
int t1 = 0;
int t2 = 1;
int i;
int new_term;
printf("Enter N :");
scanf("%d", &n);
if (n == 1)
new_term = 0;
else if (n == 2)
new_term = 1;
else
{
for (i = 3; i <= n; i++)
{
new_term = t1 + t2;
t1 = t2;
t2 = new_term;
}
}
printf("%dth term of the series is %d", n, new_term);
return 0;
}
////归纳////
int fibo(int n);
int main() {
int n;
printf("Enter n : ");
scanf("%d", &n);
printf("The %dth term of Fibonacci sequence is %d", n, fibo(n));
return 0;
}
int fibo(int n)
{
if (n == 1) return 0;
if (n == 2) return 1;
return fibo(n - 1) + fibo(n - 2);
}
答案 0 :(得分:1)
这是一个算法问题,必须被视为一个。
迭代版本将以O(n)步骤找到其结果。
对于递归版本,由于不使用任何记忆,每个术语将被计算多次。
假设N(n)是产生 n 数的步数。你需要计算fibo(n-1)和fib0(n-2)并求它们。所以你需要N(n-1)+ N(n-2)+ 1步。忽略最后一个和,N(n)与fibo(n)的数量级相同,已知它是指数的。
优化的递归算法可以在O(n)步骤中计算fibo(n),代价是在数组中存储数字(它们仍然比迭代方式效率低),但是你的朴素算法会有糟糕的性能。
递归通常允许非常简单的算法,性能非常差。