斐波那契數列的幾種變體
阿新 • • 發佈:2018-11-06
斐波那契數列的本源形式:
f(0) = 0; f(1) = 1; f(n) = f(n-1) + f(n-2).
斐波那契數列的程式碼實現:
(1)迴圈:
public int Fibonacci(int n) {
int a = 1;
int b = 1;
int c = 0;
if (n < 0) {
return 0;
} else if (n == 1 || n == 2) {
return 1;
} else {
for (int i = 3; i <= n; i++) {
c = a + b;
b = a;
a = c;
}
return c;
}
}
(2)遞迴:
public int FibonacciN(int input) {
int n = 0;
if (input == 0) {
n = 0;
} else if (input == 1) {
n = 1;
} else {
n = FibonacciN(input - 1) + FibonacciN(input - 2);
}
return n;
}
博主在Lintcode/牛客刷題的時候發現了幾道有意思的題,這些題乍看起來有點棘手,但其實就是斐波那契換湯不換藥罷了。
比如
變題1:
跳臺階:一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。(from《劍指offer》 牛客網《劍指offer》連結)
解:假設一共有f(n)種跳法,最後一步可以跳1級臺階,也可以跳2級臺階,跳1級臺階有f(n-1)種方法,跳2級臺階有f(n-2)種方法,所以可得
f(n) = f(n-1) + f(n-2)
f(1) = 1;
f(2) = 2;
實現程式碼:
public int JumpFloor(int n) { int a = 2; //f(2)的值 int b = 1; int c = 0; if(n<0){ return 0; }else if(n==1){ return 1; }else if(n==2){ return 2; }else { for(int i =3;i<=n;i++){ c = a+b; b = a; a = c; } return c; } }
變題2:
矩形覆蓋:我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?(from《劍指offer》too)
解:這道題看起來比上面的還要複雜些,之前的都是一維的,而這道題卻是二維的。但是我們依據上一題的思路來看這一題,假設一共有f(n)種方法,
下圖是最後一塊/兩塊矩形的排放方式。第一種情況共有f(n-1)種方法,第二中共有f(n-2)種方法。
所以程式碼和以上的情況一樣,此處不再羅列。
總結:沒什麼好總結的,就這樣吧。