爬楼梯问题递归解法
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); }
相关文章推荐
- 阶梯问题的递归解法
- 汉诺塔问题的递归解法
- C 递归问题的解法
- 九度OJ—题目1205:N阶楼梯上楼问题 (非递归)
- 同一问题的递归与动态规划解法
- 全排列问题、八皇后问题、组合问题的递归解法
- C#递归求解楼梯问题优化方案
- [LeetCode系列]N皇后问题递归解法 -- 位操作方式
- N皇后问题递归与非递归解法
- 关于背包问题的递归解法
- 打靶问题的一种递归解法
- p1054 简单背包问题的递归解法
- 八皇后问题的递归解法(最易理解的版本)
- 高效的八皇后问题非递归解法
- 背包问题的递归和非递归的解法
- n皇后问题的递归解法
- n皇后问题的递归解法
- 04-07递归解法问题
- 递归--基于排列的八皇后问题解法
- 【算法】 组合数问题非递归解法