1. 程式人生 > >演算法入門:斐波那契數列和演算法的時間複雜度

演算法入門:斐波那契數列和演算法的時間複雜度

此處使用三種方式實現斐波那契數列:遞迴、遞推和通項公式。

實現過程如下:

#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>

using namespace std;

// 遞迴
int recurrence1(int n)
{
    if(n==0||n==1)
        return n;
    else
        return recurrence1(n-1)+recurrence1(n-2);
}

// 遞推
int recurrence2(int n)
{
    int a[10000];
    a[0]=0;
    a[1]=1;
    if(n==0||n==1)
        return a[n];
    else
    {
        for(int i=2; i<=n; i++)
            a[i]=a[i-1]+a[i-2];
        return a[n];

    }
}

// 通項公式(得到的值都是整數)
/**
pow函式原型:
     double pow (      double base,      double exponent );
long double pow ( long double base, long double exponent );
      float pow (       float base,       float exponent );
     double pow (      double base,         int exponent );
long double pow ( long double base,         int exponent );
sqrt函式原型:
     double sqrt (      double x );
      float sqrt (       float x );
long double sqrt ( long double x );
*/
int getGeneralTermFormula(int n)
{
    double a1=pow((1+sqrt(5))/2,n);
    double a2=pow((1-sqrt(5))/2,n);
    double ans=(a1-a2)/sqrt(5);
    return ans;
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int ans1,ans2,ans3;
        ans1=recurrence1(n);
        ans2=recurrence2(n);
        ans3=getGeneralTermFormula(n);
        printf("遞迴:%d\n遞推:%d\n通項公式:%d\n",ans1,ans2,ans3);
    }
    return 0;
}

時間複雜度:

遞迴:O(2^{n})

因為每一個數都要通過遞迴求到a[0]或a[1]

遞推:O(n)

通項公式:O(1)