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);
		}
	}

你可能感兴趣的:(java,算法)