要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
首先用简单的递归实现:
public class Fibonacci{
public int fibRecusion(int n){
if(n < 0){
return 0;
}
if(n == 1){
return 1;
}
return fibRecusion(n - 1) + f(n - 2);
}
}
再用循环实现:
public class Fibonacci{
public int fibCircle(int n){
int one = 0;
int two = 1;
if(n <= 0){
return one;
}
if(n == 1){
return two;
}
int res = 0;
for(int i = 2;i <= n;i++){
res = one + two;
one = two;
two = res;
}
return res;
}
}
我们可以用2 * 1的小矩形横着或者竖着去覆盖更大的矩形。
请问用n个2 * 1的小矩形无重叠地覆盖一个2 * n的大矩形,总共有多少种方法?
- 当我们把2 * 1 的格子竖着放在第一列的时候,剩余7列我们有f(7)种方法
- 当我们把2 * 1 的格子横着放在第一列的时候,剩余6列我们有f(6)种方法
- 综上所述,8列的格子所有方法之和为f(8) = f(7) + f(6)
- 所以,这依然是一个斐波那契数列
方式一:利用递归
public class RectCover {
//递归 : num=1,result=1;num=2,result=2;num>2;result=前面两个数之和
public int cover(int num){
int[] result = {1,2};
if(num <= 0){
return 0;
}
if(num > 0 && num < 3){
return result[num - 1];
}
return cover(num - 1) + cover(num - 2);
}
}
方式二:利用循环
public class RectCover {
public static int cover(int num){
int[] result = {1,2};
if(num <= 0){
return 0;
}
if(num > 0 && num < 3){
return result[num - 1];
}
int minusOne = 2;
int minusTwo = 1;
int res = 0;
for(int i = 3;i <= num;i++){
res = minusOne + minusTwo;
minusTwo = minusOne;
minusOne = res;
}
return res;
}
}