📜  斐波那契数列C程式

📅  最后修改于: 2021-05-28 05:30:14             🧑  作者: Mango

斐波那契数是以下整数序列中的数字。

0,1,1,2,3,5,8,13,21,34,55,89,144,……..

用数学术语来说,斐波纳契数的序列Fn由递归关系定义

Fn = Fn-1 + Fn-2

具有种子值

F0 = 0 and F1 = 1.
C
// Fibonacci Series using Recursion
#include 
int fib(int n)
{
    if (n <= 1)
        return n;
    return fib(n - 1) + fib(n - 2);
}
  
int main()
{
    int n = 9;
    printf("%d", fib(n));
    getchar();
    return 0;
}


C
// Fibonacci Series using Dynamic Programming
#include 
  
int fib(int n)
{
    /* Declare an array to store Fibonacci numbers. */
    int f[n + 1];
    int i;
  
    /* 0th and 1st number of the series are 0 and 1*/
    f[0] = 0;
    f[1] = 1;
  
    for (i = 2; i <= n; i++) {
        /* Add the previous 2 numbers in the series
         and store it */
        f[i] = f[i - 1] + f[i - 2];
    }
  
    return f[n];
}
  
int main()
{
    int n = 9;
    printf("%d", fib(n));
    getchar();
    return 0;
}


C/C++
// Fibonacci Series using Space Optimized Method
#include 
int fib(int n)
{
    int a = 0, b = 1, c, i;
    if (n == 0)
        return a;
    for (i = 2; i <= n; i++) {
        c = a + b;
        a = b;
        b = c;
    }
    return b;
}
  
int main()
{
    int n = 9;
    printf("%d", fib(n));
    getchar();
    return 0;
}


输出:
34

时间复杂度: T(n)= T(n-1)+ T(n-2)是指数的。
我们可以观察到该实现做了很多重复的工作(请参见下面的递归树)。因此,对于第n个斐波那契数,这是一个错误的实现。

fib(5)   
                     /                  
               fib(4)                fib(3)   
             /                      /     
         fib(3)      fib(2)         fib(2)    fib(1)
        /             /           /      
  fib(2)   fib(1)  fib(1) fib(0) fib(1) fib(0)
  /    
fib(1) fib(0)

额外空间:如果考虑函数调用堆栈的大小,则为O(n),否则为O(1)。

方法2(使用动态编程)
通过存储到目前为止计算出的斐波那契数,我们可以避免方法1的重复工作。

C

// Fibonacci Series using Dynamic Programming
#include 
  
int fib(int n)
{
    /* Declare an array to store Fibonacci numbers. */
    int f[n + 1];
    int i;
  
    /* 0th and 1st number of the series are 0 and 1*/
    f[0] = 0;
    f[1] = 1;
  
    for (i = 2; i <= n; i++) {
        /* Add the previous 2 numbers in the series
         and store it */
        f[i] = f[i - 1] + f[i - 2];
    }
  
    return f[n];
}
  
int main()
{
    int n = 9;
    printf("%d", fib(n));
    getchar();
    return 0;
}
输出:
34

时间复杂度: O(n)
额外空间: O(n)

方法3(空间优化方法2)
我们只能通过存储前两个数字来优化方法2中使用的空间,因为这是我们获取序列中下一个斐波纳契数所需要的全部。

C / C++

// Fibonacci Series using Space Optimized Method
#include 
int fib(int n)
{
    int a = 0, b = 1, c, i;
    if (n == 0)
        return a;
    for (i = 2; i <= n; i++) {
        c = a + b;
        a = b;
        b = c;
    }
    return b;
}
  
int main()
{
    int n = 9;
    printf("%d", fib(n));
    getchar();
    return 0;
}
输出:
34

请参阅有关斐波那契数字的程序的完整文章,以了解更多详细信息!

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。