跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
一个递归问题,我们可以这样想:
因为先后次序不同算不同结果,所以只有这两种方式,即f(n)=f(n-1)+f(n-2)种跳法。
递归出口:当n=1时,只有一种跳法;当n=2时,有两种跳法(1,1和2)。
Demo:
int jumpFloor(int number)
{
if (number <= 0) return -1;
else if (number == 1) return 1;
else if (number == 2) return 2;
else return jumpFloor(number-1) + jumpFloor(number-2);
}
变态跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
在上个问题的基础上,增加了可以跳1-n级。
所以f(n) = f(n-1) + f(n-2) + … + f(n-n) = f(0) + f(1) + … + f(n-1)
f(n-1) = f(n-1-1) + f(n-1-2) + … + f(n-1-n+1) = f(0) + f(1) + … + f(n-2)
所以 f(n) = 2 * f(n-1)
递归出口:当n=1时,只有一种跳法。
Demo:
int jumpFloorII(int number)
{
if (number <= 0) return -1;
else if (number == 1) return 1;
return 2 * jumpFloorII(number-1);
}
矩形覆盖问题
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
这个问题和跳台阶问题完全相同,我们只需要考虑大矩形的n那一边,而2那一边就算横着放,放俩就得了。
Demo同一。