以下两个C程序(迭代和归纳)中哪一个更有效地找到第n个Fibonacci数?

时间:2017-04-03 14:35:12

标签: c recursion iteration fibonacci induction

如上所述,试图找出以下两个程序中的哪一个对于找到第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);
}

1 个答案:

答案 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),代价是在数组中存储数字(它们仍然比迭代方式效率低),但是你的朴素算法会有糟糕的性能。

递归通常允许非常简单的算法,性能非常差。