1. 程式人生 > >斐波那契數列的遞迴與迴圈實現及複雜度分析

斐波那契數列的遞迴與迴圈實現及複雜度分析

一、斐波那契數列的定義:

二 、遞迴實現:

經典例題(杭電2041):

 AC程式碼:

#include <iostream>

using namespace std;
int f[41];
int main()
{
    int num,m;
    cin >> num;
    while(num--){
        f[1] = 1;
        f[2] = 1;
        for(int i = 3;i < 41;i++){
            f[i] = f[i-1] + f[i-2];
        }
        cin >> m;
        cout << f[m] << endl;
    }
    return 0;
}

 時間複雜度分析(以n=5為例):

時間複雜度為二叉樹的節點個數:(2^h)-1=O(2^N) 空間複雜度為樹的高度:h即O(N)

分析:遞迴實現的程式碼簡潔易懂,但是需要注意的是,遞迴由於是函式呼叫自身,而函式呼叫是有時間和空間的消耗的,每一次函式呼叫,都需要在記憶體棧中分配空間以儲存引數、返回地址及臨時變數,而往棧裡壓入資料和彈出資料都需要時間,因而遞迴實現的效率不如迴圈。 

 三、迴圈實現:

#include<stdio.h>
int main()
{
    int a = 0, b = 1, n = 5;
    for(int i = 2;i <= n;i++){
        int t = b;
        b = a + b;
        a = t;
    }
    printf("%d\n", b);
    return 0;
}

時間複雜度:O(N),空間複雜度:O(1)。

四、補充:

複雜度O符號表示取上界,Ω表示取下界,Θ當且僅當O() = Ω()時成立。

對於下列題目:

Θ(Fn)中的Fn表示時間複雜度與Fn的取值有關,事實上,時間複雜度只與我們求的是第幾項有關,而與第幾項的取值無關。

常用時間複雜度所耗費的時間從小到大依次是

O(1)<  O(logN) < O(N) < O(NlogN) < O(N^2) < O(N^3) < O(2^N) < O(N!)  <  O(N^N)