斐波那契數列的遞迴與迴圈實現及複雜度分析
阿新 • • 發佈:2018-12-10
一、斐波那契數列的定義:
二 、遞迴實現:
經典例題(杭電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)