问题描述:一个青蛙,一次可以跳1级台阶,也可以跳2级,…也可以跳n级,总共有m级台阶,问青蛙总共有多少种跳法?
问题分析:
以n=2为例
当m =1 时f(1) = 1
当m =2 时f(2) = 2
当m =3 时f(3) = 3 = f(2)+f(1)
当m =4 时f(4) = 5 = f(3)+f(2)
因此当m>2的时候f(m) = f(m-1)+f(m-2)
参考斐波那契数列
以n=3为例
当m =1 时f(1) = 1
当m =2 时f(2) = 2
当m =3 时f(3) = 4
当m =4 时f(4) = 7 = f(3)+f(2)+f(1)
当m =5 时f(5) = 13 =f(4)+f(3)+f(2)
因此当m>3的时候f(m) = f(m-1)+f(m-2)+f(m-3)
以此类推当n=n的时
当m =1 时f(1) = 1
当m =2 时f(2) = 2
当m =3 时f(3) = 4
当m =4 时f(4) = 8
当m =5 时f(5) = 16
…
当m = n时候f(m) = 2*f(m-1)
当m > n的时候 f(m) = f(m-1)+f(m-2)+…+f(m-n)
因此 f(m-1) = f(m-2) + f(m-3)+…+f(m - n)+f(m -n -1)
简化得到:f(m) = 2f(m-1) - f(m-n-1)
public int stepNM(int n,int m){
if(m <= 0) {
return 1;
}else if(m == 1) {
if(n >=1) {
return 1;
}else {
return 0;
}
}else if(m == 2) {
if(n < 1) {
return 0;
}else if(n==1) {
return 1;
}else if(n>=2) {
return 2;
}
}else if(n >= m) {
return 2*stepNM(n,m-1);
}else {
return 2*stepNM(n,m-1) - stepNM(n,m-n-1);
}
return -1;
}