您的位置:首页 > 其它

爬楼梯问题递归解法

2018-03-20 19:07 232 查看

简单爬楼梯

  一个人爬楼梯,一次最多只能爬3级,问爬上15级楼梯一共有多少种方法?

 一般遇到这种问题我们可以考虑递归,从最后开始考虑。因为一次性最多只能爬3级楼梯,那么想爬上15级楼梯无非就是以下三种情况:

 1.从14级楼梯爬1级上去

 2.从13级楼梯爬2级上去

 3.从12级楼梯爬3级上去

 设爬n级楼梯的方法数为f(n),则f(15) = f(14) + f(13) + f(12),又因为f(1)=1,f(2)=2,f(3)=4,所以递归写法就一目了然了:

int jumpFloor(int n)
{
if(1 == n)return 1;
if(2 == n)return 2;
if(3 == n)return 4;
else return jumpFloor(n-1)+jumpFloor(n-2)+jumpFloor(n-3);
}


复杂爬楼梯

 如果现在问题变为一个人爬n级的楼梯,他可以一次爬1级,2级,…,n级,请问他爬n级的方法数f(n)是多少?

 根据之前的结论,我们很容易得到:

 f(n) = f(n-1) + f(n-2) + … + f(n-(n-1)) + f(n-n)

 这里f(n-1)表示爬1级楼梯到n的方法数,f(n-n)就表示直接爬n级楼梯到n的方法数(其实就是1),此时我们可以再看一下f(n-1)

 f(n-1) = f(n-1-1) + … + f((n-1)-(n-1-1)) + f((n-1)-(n-1))

      =f(n-2)+f(n-3)+…+f(n-1)+f(n-n)代入f(n)

 f(n) = f(n-1) + f(n-1) = 2 * f(n-1)

 递推关系式出来了代码就很好写了:

int jumpFloor2(int n)
{
if(1 == n)return 1;
else return 2 * jumpFloor2(n-1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: