斐波那契數列又稱**分割數列。它的特點是從第3個數開始,每乙個數都等於前面兩個數相加。
例:0 1 1 2 3 5 8 13 21.。。。。。
從上我們可以總結出以下規律:
當n = 0時; f(n) = 0;
當n = 1時; f(n) = 1;
當n > 1時; f(n) = f(n-1)+f(n-2);
那我們如何求出這個數列中第n個數是多少呢?
(一)以指標實現斐波那契數列
#include#includeusing namespace std;
/*時間複雜度:o(n)
空間複雜度:0(n)
*/long long fib(long long n)//當n = 30時,斐波那契數已經很大了,所以我們把型別定義為long long
// 建立乙個指標,並為該指標開闢空間
//因為數列最開始有乙個0,所以當我們求第n個數的時候,需要多開劈乙個空間
long long *p = new long long[n+1];
p[0] = 0;
p[1] = 1;
for(int i = 2;i < n+1; i++)
//返回要找的第n個數
return p[n];
}
(二)交替相加法(我自己起的名字)
建立乙個first變數,乙個second變數,乙個third變數。third = first + second。
每加完一次,都把first的值置成second,把second置成third。得到新的兩個變數,然後求取新的third。
/*
時間複雜度:o(n)
空間複雜度:0(1)
*///省略了標頭檔案,全域性命名空間
long long fib(long long n)
long long first = 0;
long long second = 1;
long long third = 0;
for(int i = 2;i<=n;i++)
return third;
}
(三)遞迴演算法
這三個演算法中,遞迴可謂是最簡單的也是最難理解的。我們先看**:
/*
時間複雜度:o(2^n)
空間複雜度:o(n)
*///省略了標頭檔案,全域性命名空間
long long fib(long long n)
return fib(n-1)+fib(n-2);
}
這個遞迴的終止條件是 n==1 或 n == 2 。
當我們傳進去的n大於這兩個數的時候,這個程式對執行
return fib(n-1)+fib(n-2);
遞迴進入下一層,直到滿足終止條件。再一層一層返回。最後返回我們想要的值。 三種方法實現斐波那契數列
問題描述 編寫程式在控制台輸出斐波那契數列前t項,每輸出5個數換行 第一種方法 耗時比較短 publicstaticvoidtest1 long t longend system.currenttimemillis system.out.println end start 第二種方法 耗時太長沒有測...
斐波那契數列的三種實現方法
斐波那契數列是學習演算法碰到的,以自己當前的知識面還不足以想到通過公升高乙個維度來降低演算法的時間複雜度.昨天再看劍指offer的時候,在面試題9中提到了三種實現計算斐波那契數列的方法.在這裡實現三種做法貌似還有乙個o 1 的計算方法,也就是斐波那契數列是可以直接推到出來的.1.常規的遞迴演算法 d...
求斐波那契數列的三種方法
什麼是斐波那契數列,1,1,2,3,5,8,13.這樣乙個數列就是斐波那契數列,求第n項的值。一 經典求法 觀察數列可得,除了第一項和第二項,所有的數列的值都是前一項和前一項的前一項的加和,轉換成函式也就是f n f n 1 f n 2 public static int f1 int n else...