爬楼梯算法-java(递归与非递归)
来源:互联网 发布:js 抓取html 编辑:程序博客网 时间:2024/06/09 22:29
爬楼梯算法-java
在网上看到一个爬楼梯的算法,这里记录一下:
第一种题目(递归实现):
假设一个楼梯有 N 阶台阶,人每次最多可以跨 M 阶,求总共的爬楼梯方案数。
例如楼梯总共有3个台阶,人每次最多跨2个台阶,也就是说人每次可以走1个,也可以走2个,但最多不会超过2个,那么楼梯总共有这么几种走法:
我们使用递归处理,在最后最多可跨越阶数大于剩余台阶的时候,需要做处理。
递归函数如下:
private static int calculateCount(int ladder, int maxJump) { int jump = 0; if (ladder == 0) { return 1; } if (ladder >= maxJump) { // 剩下的楼梯大于最大可跳跃数 for (int i = 1; i <= maxJump; i++) { jump += calculateCount(ladder - i, maxJump); } } else { // 剩下的楼梯不足最大可跳跃数 jump = calculateCount(ladder, ladder); } return jump;}
调用方式:
public static void main(String[] args) { int ladder = 4; int maxJump = 2; int i = calculateCount(ladder, maxJump); System.out.println(i);}
这题有一道变体(非递归方式实现):
假设一个楼梯有 N 阶台阶,人每次最多可以跨 2 阶,求总共的爬楼梯方案数,要求不用递归实现
先不写代码,自己计算当楼梯数为1、2、3、4、5时,对应的爬法有:1、2、3、5、8、13、21种。
可以发现,随着楼梯数n的增加,爬法总数呈现斐波那契数列规律增加,即f(n) = f(n-1) + f(n-2)
知道这个规律后,使用下面的循环即可实现:
/** * @param ladder 台阶数量 * @return 总的爬法 */private static int count(int ladder) { if (ladder == 1 || ladder == 2) { return ladder; } int n1 = 1; int n2 = 2; for (int i = 3; i <= ladder; i++) { int tmp = n2; n2 = n1 + n2; n1 = tmp; } return n2;}
调用代码:
for (int i = 1; i <= 9; i++) { System.out.println("当楼梯数为 " + i + " 时,有 " + count(i) + " 总爬法");}
最后输出的结果为:
参考:
http://50vip.com/77.html
http://thecodesample.com/?p=1083
0 0
- 爬楼梯算法-java(递归与非递归)
- leetcode_70. Climbing Stairs 爬楼梯,非递归算法
- 爬楼梯(递归)
- 单链表逆置-java(递归与非递归)
- 单链表逆置-java(递归与非递归)
- 数据结构与算法(Java描述)-17、递归转化成非递归算法以及迷宫算法
- Java二叉树,递归与非递归遍历算法
- 超级楼梯(递归算法)
- [leetcode]爬楼梯的递归和非递归方法
- 二叉树的遍历算法(递归与非递归)
- 二分查找算法(递归与非递归实现)
- 二叉树算法的实现(递归与非递归)
- 二叉树算法(递归与非递归)
- 归并排序算法(递归与非递归)
- 算法(08):递归与非递归
- 巴基卡三角非递归与递归算法
- 二分查找递归与非递归算法
- 递归与非递归算法的分析
- iTerm 2 —— Mac上的好用终端
- activiti数据库表结构剖析
- Android图片处理
- FingerGesture收集
- 设计模式-访问者
- 爬楼梯算法-java(递归与非递归)
- Android性能优化
- 连通图最小生成树之普里姆算法
- 大型互联网站点HTTPS实践 1
- SWT开发常见异常
- webRTC在Win7 VS2013上的编译
- Uncowed Forces
- JS寻找公共项
- EM聚类算法(一)