题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
分析思路
(1)斐波那契函数,递归方法
如果n<=0,就是0种方法;如果n=1,就只有1种方法;如果n=2,就有2种方法,分别将2*1的小矩形横着放和竖着放;当n=3时,新增加的一个可以横着放,也可以竖着放,竖着放的情况就是f(3)=f(2),横着放的情况就是f(3)=f(1),所以f(3)=f(2)+f(1),后面依此类推。
public class Solution {
public int RectCover(int target) {
if(target <= 0 )//如果输入的target小于等于0就返回0
return 0;
else if(target == 1)//如果为1,就返回1
return 1;
else if(target == 2)//如果是2,就是一个正方形,返回2
return 2;
else
return RectCover(target - 1)+ RectCover(target - 2);
//target>2时,最后一个可以横着放,也可以竖着放,横着放个数就是RectCover(n-2)
//竖着放的个数就是RectCover(n-1),所以总共的方法就是这两种情况加起来,就是一种递归。
}
}
(2)将递归改成循环方法
public class Solution {
public int RectCover(int target) {
if(target<=0)
return 0;
if (target == 1)
return 1;
if (target == 2)
return 2;
int a = 1;
int b = 2;
int c = b;
for(int i = 0;i<target-2; i++){
c=a+b;
a=b;
b=c;
}
return c;
}
}