问题:有一只兔子,从第3个月开始每月生1只兔子,小兔子长到第3个月开始每个月也会生1只兔子,假如兔子都不死,问每个月的兔子总数是多少?
分析:乍一看觉得问题挺复杂,仔细分析之后发现,兔龄2个月及2个月以上的兔子在新的1个月每只都会生1只兔子。对于新的这个月来说,之前兔龄2个月及2个月以上的兔子就是2个月前的兔子总数,也就是说新的1个月相比上1个月增加的兔子数是2个月前的兔子数,其实就是当月的兔子数等于前两个月的兔子数之和。这样一分析,问题就很简单了,目前有两种实现方式,递归的和非递归的。先来看非递归的:
private static void rabbitTest1() {
int sum_rabbit = 1; //兔子总数
int one_ago_rabbit = 1; //1个月前兔子总数
int two_ago_rabbit = 1; //2个月前兔子总数
for (int month = 1; month < 11; month++) {
if (month < 3) {
sum_rabbit = 1;
} else {
sum_rabbit = one_ago_rabbit + two_ago_rabbit;
two_ago_rabbit = one_ago_rabbit;
one_ago_rabbit = sum_rabbit;
}
System.out.println("第" + month + "个月" + sum_rabbit + "只兔子");
}
}
执行结果:
再来看递归的方法:
private static void rabbitTest2() {
for (int i = 1; i < 11; i++) {
System.out.println("第" + i + "个月" + rabbit(i) + "只兔子");
}
}
private static int rabbit(int month) {
if (month < 3) {
return 1;
} else {
return rabbit(month -2) + rabbit(month - 1);
}
}
执行结果:
两种方法思路和结果其实是一致的。