爬楼梯
只有两种上法,一级或者两级
每走一步,都会面临两种选择(上一级或者跳两级),不管做出哪种选择,都要递归把走完这步后的剩余楼梯阶数传给下一次,继续面临两种选择
至于有多少种走法,必须是两种选择后产生的所有可能的总和
拿个最简单的3级楼梯:
已知1级楼梯仅剩1种走法,2级楼梯仅剩2种走法,得:
1:第一次先走一级,那么只剩下两级,两级楼梯仅剩两种走法,所以返回2
2:第一次先走两级,那么只剩下一级,一级楼梯仅剩一种走法,所以返回1
所以三级楼梯的全部跳法只有:2+1 = 3种,罗列出来:
第一种:1,1,1
第二种:2,1
第三种:1,2
所以思路就清晰了,每次递归都分两种情况减少对应的步长,直到减到2或者1,再直接返回已知的走法,两种情况加起来,就是N级阶梯总的可能走法
公式:
0, n<=0;
f(n) = { 1, n = 1;
2, n=2;
f(n-1)+f(n-2) , n>2;
得出了公式,再拿一个复杂点的例子,4级楼梯:
先看开始先走一级的情况:
1:先走1级(剩下3级)
1-1:走1级(剩下2级,返回仅有的2种走法)
1-2:走2级(剩下1级,返回仅有的1种走法)
2:先走2级(剩下2级,直接返回仅有的2种走法)
所以,4级楼梯总的走法为2+1 +2 = 5
回过头再看:
0级楼梯:0种走法
1级楼梯:1种走法
2级楼梯:2种走法
3级楼梯:3种走法
4级楼梯:5种走法
………
轻松看出,从3开始,每一项都是前两项之和,这种数列,数学家们称为斐波那契数列
不纠结于什么波数列,反正按照我们自己的思路,代码也就呼之欲出:
guagua,就是呱呱,青蛙🐸
Public static int gugua_jump( int step ){
if (step <=0 ) {
return 0;
}
if (step <=2 ) {
return step;
}
// 递归算出当前选择跳1级的情况
int jump1 = gugua_jump(step-1);
// 递归算出当前选择跳2级的情况
int jump2 = guagua_jump(step-2);
// 返回当前N级楼梯的两种跳法的总和
return jump1 + jump2;
}
main方法调用一下:
public static void main(String[] args) throws IOException {
int sum = guagua_jump(5);
System.out.println(sum);
}
这里假设一共5级楼梯,按照什么波的逻辑,5级= 4级+3级 = 5+3 = 8