问题:有一个小孩在上楼梯,楼梯有n阶,小孩一次可以上1阶、2阶、3阶,请实现一个方法,计算小孩有多少种上楼的方式
package 递归;
import java.util.Scanner;
/**
*
*
* 如果有1个台阶,走法有一种(一步走1个台阶) 即f(1)=1
* 如果有2个台阶,走法有2种(一种是上1阶,再上1阶,另一种是一步上2阶) 即f(2)=2
* 如果有3个台阶,走法有3种(f(1)+f(2)),就是在走了2阶了,然后最后一阶该怎么走 那就加上f(1)呗
* 当有n个台阶(n>3)时,我们缩小问题规模,可以这样想:最后是还剩1个台阶了,之前已经走了(n-1)个台阶 有f(n-1)种走法
* 如果最后还剩2个台阶,之前走了(n-2)个台阶,那就有f(n-2)种走法
*
*
* @author Ad
*
*/
public class 走阶梯1 {
private static int num;
static int mod=1000000007;
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int num=input.nextInt();
// method(num);
System.out.println(method(num,mod));
}
private static int method(int num,int mod) {
if (num==1) {
return 1;
}
if(num==2){
return 2;
}
return method(num-1,mod)%mod+method(num-2,mod)%mod;
}
}
package 递归;
import java.util.Scanner;
/**
*有一个小孩在上楼梯,楼梯有n阶,小孩一次可以上1阶、2阶、3阶
*请实现一个方法,计算小孩有多少种上楼的方式
*
* @author Ad
*
*/
public class 走阶梯2 {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int num=input.nextInt();
// method(num);
System.out.println(method(num));
}
private static int method(int num) {
int mod=1000000007; //为了防止溢出,结果求模 mod 1000000007
if(num==1) return 1;
if(num==2) return 2;
if(num==3) return 4;
int x1=1;
int x2=2;
int x3=4;
for (int i = 4; i <=num; i++) {
int x_1=x1;
x1=x2;
x2=x3;
x3=(((x1+x2)%mod)+x_1)%mod;
}
return x3;
}
}
//
// num: 1 2 3 4 5 x6
// x1 x2 x3
// x1 x2 x3
// x1 x2 x3