上楼梯(cc150)

题意:有一个小孩正在上楼梯,楼梯有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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值