JAVA经典案例,不死神兔不用递归算法
不死神兔
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?
分析思路(不用递归思想)
首先,有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,所以就意味着,每对兔子从第三个月起,每个月都生一对兔子。那么,我们就可以将各对兔子分成3种类型:1.一个月大的兔子,2.两个月大的兔子,3.老兔子(三个月大及以上的兔子)。
然后,月数每增加1,一个月大的兔子会长成两个月大的兔子,而两个月大的兔子会长成老兔子,并且这个月所有的老兔子又生一个月大的兔子。所以,就有以下结论:
本月老兔子的对数 = 前一个月两个月大的兔子的对数 + 前一个月老兔子的对数
本月两个月大的兔子的对数 = 前一个月一个月大的兔子的对数
本月一个月大的兔子的对数 = 本月老兔子的对数
如此,每个月兔子的对数就等于三种类型兔子的对数的总和,问题迎刃而解。
代码实现(以第20个月为例)
public class CountRabbitNumber{
public static void main(String[] args){
int month = 20;
int count = getCount(month);
System.out.println("第" + month + "个月兔子的对数是: " + count);
}
public static int getCount(int month) {
//初始化第一个月各种兔子的对数
int num1 = 1;//一个月大的兔子的对数
int num2 = 0;//两个月大的兔子的对数
int num3 = 0;//老兔子的对数
for (int i = 2; i <= month; i++) {
num3 += num2;//本月老兔子的对数 = 前一个月两个月大的兔子的对数 + 前一个月老兔子的对数
num2 = num1;//本月两个月大的兔子的对数 = 前一个月一个月大的兔子的对数
num1 = num3;//本月一个月大的兔子的对数 = 本月老兔子的对数
}
return num1 + num2 + num3;
}
}
怎么样,是不是很那个啥!