爬楼梯算法-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