题意:有一个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶,2阶,3阶。请实现一个方法,计算小孩有多少种上楼梯的方式。为了防止溢出,请将结果Mod 1000000007。
给定一个正整数,请返回一个数,代表上楼的方式数。保证n小于等于100000.
思路:上楼梯问题已经做过(铺瓷砖问题)。本次讨论“逐步生成结果类”问题。比较迭代和递归的区别。
自上而下的递归(递推,数学归纳,动态规划)
——解决简单情况下的问题;
——推广到稍微复杂的问题
——如果递推次数很明白,则用迭代
——如果有封闭形式,可直接求解
注:虽然递归,从大到小调用,但还是从小到大计算。
public class 走楼梯 {
static final int mod=1000000007;
public static void main(String[] args) {
System.out.println(f2(4));
}
//用递归
public static long f1(int n) {
if(n<0) return 0;
if(n==0||n==1) return 1;
if(n==2) return 2;
return f1(n-1)%mod+f1(n-2)%mod+f1(n-3)%mod;
}
//用迭代
public static int f2(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 x0=x1;
x1=x2%mod;
x2=x3%mod;
x3=((x1+x2)%mod+x0)%mod;
}
return x3;
}
}