题意:
- 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶、3阶。
- 请实现一个方法,计算小孩有多少种上楼的方式。
为了防止溢出,请将结果Mod 1000000007
给定一个正整数int n,请返回一个数,代表上楼的方式数。
保证n小于等于100000。
package _7递归;
/*
* 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶、3阶。
* 请实现一个方法,计算小孩有多少种上楼的方式。
为了防止溢出,请将结果Mod 1000000007
给定一个正整数int n,请返回一个数,代表上楼的方式数。
保证n小于等于100000。
*/
public class a上楼梯 {
static final int mod =100000007;//为了防止溢出
public static void main(String[] args) {
long a=recursion1(5);
recursion2(7);
System.out.println(a);
System.out.println(recursion2(7));
}
public static long recursion1(int n) {//顺着想,倒着写
if(n<0) {
return 0;
}
if(n==0||n==1 ) {
return 1;
}
if(n==2) {
return 2;
}
//n=4 2 1 ;n=2 2 ;b=4 1 4 ;返回n=4 1+2+4=7 ;返回n=3 1+2+4+4; n=2
return recursion1(n-1)%mod +recursion1(n-2)%mod+recursion1(n-3)%mod;
//4 1
}
public static int recursion2(int n) {//迭代,不断更新前面的数顺着下顺着写
if(n<0) {
return 0;
}
if(n==0||n==1) {
return 1;
}
if(n==2) {
return 2;
}
if(n==3) {
return 4;
}
int x1=1;
int x2=2;
int x3=4;
for(int i=4;i<=n;i++) {//迭代公式
int x_1=x1;
x1=x2;
x2=x3;
x3=((x1+x2)+x_1);
}
return x3;
}
}