有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? Java实现

题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

我的思路:模拟兔子出生过程。想象有一个装兔子的容器,有一个按月划分的时间轴。第一个月,容器里只有一对兔子,兔子的出生月为1。然后每个月遍历一遍容器里的所有兔子,遍历的兔子数量为上一个月的兔子总量,如果当前月数-兔子的出生月数>=2,容器里就多一对兔子,并且把新增的兔子的出生月设置为当前月。需要知道哪一月的兔子数量,就把这个月设为当前月,获得当前月兔子数量即可。Java代码如下:

		List<Integer> rabbitContainer = new ArrayList<Integer>();
		rabbitContainer.add(new Integer(1));
		for(int i = 1 ; i <= month; i ++){
			for(int j = 0; j < rabbitContainer.size(); j++){
				if((i - rabbitContainer.get(j)) >= 2){
					rabbitContainer.add(new Integer(i));
				}
			}
		}
		return rabbitContainer.size();
	}
网上经典解决方法:设当前第i个月,这个月的兔子总数,大致可以分为2部分,1部分是非新生的,另一部分是当月新生的。非新生的应该是第i-1个月的兔子总数,新生的取决于第i-2个月的兔子总数。即兔子[i]=兔子[i-1]+兔子[i-2]。于是,各个月的兔子数就形成了一个斐波那契数列:斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...。Java代码 下:

	public int getRabbitNum(int month) {
		// TODO Auto-generated method stub
		int rabbitNum = 1;
		if(month > 0 && month < 3){
			return rabbitNum;
		} else {
			return getRabbitNum(month - 1) + getRabbitNum(month - 2);
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值