题目1:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
分析:
a.总共有两种跳法,1阶或者2阶,假定第一次选择跳一阶,那么剩下n-1个台阶,跳法有f(n-1)种;
b.假定第一次选择跳2阶,那么剩下n-2个台阶,跳法有f(n-2)种;
c.由a、b假设可以得出总跳法为: f(n) = f(n-1) + f(n-2)
d.然后通过实际的情况可以得出:只有一阶的时候只有一种跳法 f(1) = 1 ,只有两阶的时候有两种跳法 f(2) = 2;
e.可以发现最终得出的是一个斐波那契数列:
| 1, (n=1)
f(n) = | 2, (n=2)
| f(n-1)+f(n-2) ,(n>2,n为整数)
题目2:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
分析:
a.总共有两种两种覆盖方式,横着--1*2或者竖着--2*1,假定第一次选择横着1*2,那么有f(n-2)种覆盖方式;
b.假定第一次选择竖着2*1,那么有f(n-2)种覆盖方式;
c.由a、b假设可以得出总覆盖方式为: f(n) = f(n-1) + f(n-2)种;
d.然后通过实际的情况可以得出:n为1时,只有一种覆盖方式 f(1) = 1;n为2的时,有两种覆盖方式 f(2) = 2;
e.可以发现该问题最终得出的也是一个斐波那契数列:
| 1, (n=1)
f(n) = | 2, (n=2)
| f(n-1)+f(n-2) ,(n>2,n为整数)
代码:
public class Solution
{
public int JumpFloor(int target)
{
//检查参数的合法性
if(target<=0)
return 0;
//台阶数为1时,只有1种跳法
else if(target==1)
return 1;
//台阶数为2时,有2种跳法
else if(target==2)
return 2;
//台阶数大于等于3时,有f(n)种跳法,f(n)=f(n-1)+f(n-2);
else
return JumpFloor(target-1)+JumpFloor(target-2);
}
}