需求:
用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
分析:
此题的突破口在n的个数数;n不一样,结果就不一样;由n来找规律。
台阶数 | 跳法 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 5 |
5 | 8 |
6 | 13 |
...... | ...... |
通过分析台阶数,可以看出当为n时,方法数为前两个之和,设方法数为函数f(n),则有:
f (n) = f(n-1)+ f(n-2);
这是一个一个斐波那切数列,所以转化为求解斐波那切数列问题
实现代码:
import java.util.Scanner;
public class 矩形覆盖 {
public static int f(int n) {
if(n<2){
return n;
}else{
return f(n-1)+f(n-2);
}
}
public static void main(String[] args) {
System.out.println("请输入n:");
Scanner s=new Scanner(System.in);
int n=s.nextInt();
System.out.println("方法数为:");
System.out.println(f(n));
}
}
分析:
- 首先,当位数为1时返回值为1;位数为2时返回2;因为他们是起始值;
- 然后,当位数为3时,其返回值 = 2 = 1 + 1;当位数为3时,其返回值 = 2 = 1 + 1;
当位数为4时,其返回值 = 3 = 2 + 1;
当位数为3时,其返回值 = 5 = 3 + 2;
当位数为3时,其返回值 = 8 = 5 + 3;
......
所以由以上可得,大于等于3的情况下,当前位数的值
f (n) = f(n-1)+ f(n-2)。
输出示例为:
请输入n:
10
方法数为:
55