斐波那契數_從樓梯問題說開去
阿新 • • 發佈:2019-02-02
正式講一下斐波那契數:
首先我們知道有一個著名的演算法面試題:
一共有n個臺階,你一次可以走一個臺階,或者兩個臺階。那麼,走到臺階頂時,一共有多少種走法。
比如三個臺階,你可以 1,2。。。或者1,1,1 或者2,1。。一共三種走法。
網路上會有幾種做法,
1.直接思路:
這好像是這道題目的標準“解法”
如果我們現在在n階,那麼我們可以邁一步或者邁兩步,結果就是
f(n) = f(n-1) + f(n-2)。。。即n的臺階的種數應該是,n-1階的種數與n-2階種數之和(由於第一步就不一樣,所有,後面的二者互相獨立)。
所以
int f(int n) {
if(n ==0 || n == 1) {
return 1;
}
return f(n-1)+f(n-2);
}
2. 動態規劃
1的東西雖然給出了這個題的一個突破口,但還是有些問題比如:第1中的時間複雜度時是指數次的,過於龐大。。
所以可以考慮用動態規劃。。第三版第15章的動態規劃內容
如果有我們可以預先紀錄下f(n-1),或者f(n-2),避免重複計算。
所以
a[n] = {0};
a[0] = 1; a[1] = 1;
int f(int n) {
if(a[n] != 0) {
return a[n];
}
a[n] = f(n-1)+f(n-2)
return a[n];
}
這個時間複雜度就比較好了,空間和時間都是O(n) 。(當然後面我們會看到,這麼說不是很恰當)
int f(int n) {
int a = 1; b = 1;
int c = 0;
for(int i = 1; i < n; i++) {
c = a;
a = a+b;
b = c;
}
return a;
}
--------------------上面的東西足夠應付面試----------------------- -------------------下面只是本人藉著演算法導論開腦洞的結果----------------- 4. 矩陣快乘