斐波那契数列的本源形式:
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)种方法。
代码和以上的情况一样,此处不再罗列。
总结:没什么好总结的,就这样吧。