1. 程式人生 > >【劍指offer】斐波那契數列 遞迴 迴圈 時間 c++

【劍指offer】斐波那契數列 遞迴 迴圈 時間 c++

題目:大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。n<=39

思路:可以用兩種方法實現,這裡遞迴的辦法因為有太多重複的計算會超時(計算n=39,需要4s左右,題目要求1s),遂改用迴圈語句寫(經測試n=39時,完全小於1s),下面的程式碼中也給出了c++中計算時間的辦法之一,供參考。

費波那契數列定義如下:

  • F_{0}=0
  • F_{1}=1
  • F_{n}=F_{{n-1}}+F_{{n-2}}(n≧2)          (from wiki)
     1 #include<cstdio>
     2 #include<time.h>
     3
    using namespace std; 4 5 class Solution { 6 public: 7 int Fibonacci(int n) { 8 int a = 0; 9 int b = 1; 10 int temp = 0; 11 if (n == 0) return 0; 12 for (int i = 1; i < n; i++) { 13 temp = b; 14 b = a + b; 15 a = temp;
    16 } 17 return b; 18 } 19 int Fibonacci_rec(int n) { 20 if (n == 0) return 0; 21 if (n == 1) return 1; 22 return Fibonacci_rec(n - 1) + Fibonacci_rec(n - 2); 23 } 24 }; 25 26 int main(){ 27 long star,end,star_rec,end_rec; 28 Solution slt; 29 int
    n = 39; 30 int ans,ans_rec; 31 32 //迴圈實現 33 star = clock(); 34 ans = slt.Fibonacci(n); 35 end = clock(); 36 37 //遞迴實現 38 star_rec = clock(); 39 ans_rec = slt.Fibonacci_rec(n); 40 end_rec = clock(); 41 42 printf("%d , time_loop : %.15f\n", ans,(double)(end-star)/CLOCKS_PER_SEC); 43 printf("%d , time_recr : %.15f", ans_rec, (double)(end_rec - star_rec) / CLOCKS_PER_SEC); 44 return 0; 45 }