斐波那契數列的本源形式:
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)種方法。
代碼和以上的情況一樣,此處不再羅列。
總結:沒什么好總結的,就這樣吧。