题目描述:
兔子生崽问题。假设一对小兔的成熟期是一个月,即一个月可长成成兔,每对成兔每个月可以生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,一年以后可有多少对兔子?
这道题目一眼看过去就是典型的递归问题,代码如下
public class RabbitReproduction {
public static void main(String[] args) {
int months = 12;
System.out.println("After " + months + " months, there will be " + rabbitPairs(months) + " pairs of rabbits.");
}
public static int rabbitPairs(int n) {
if (n == 1 || n == 2) {
return 1;
}
return rabbitPairs(n - 1) + rabbitPairs(n - 2);
}
}
递归方法:rabbitPairs 使用递归来计算每个月的兔子对数。这个问题类似于斐波那契数列:
第一个月和第二个月有 1 对兔子。
从第三个月开始,每个月的兔子对数等于前两个月的兔子对数之和。
但是这道题目虽然简单,但是递归方法可能会导致性能问题。
public class RabbitReproduction {
public static void main(String[] args) {
int months = 12;
System.out.println("After " + months + " months, there will be " + rabbitPairs(months) + " pairs of rabbits.");
}
public static int rabbitPairs(int n) {
if (n == 1 || n == 2) {
return 1;
}
int[] dp = new int[n + 1];
dp[1] = 1;
dp[2] = 1;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
- 数组
dp
:用于存储每个月的兔子对数。 - 初始条件:
dp[1]
和dp[2]
都设为 1,因为第一个月和第二个月只有一对兔子。 - 状态转移方程:
dp[i] = dp[i - 1] + dp[i - 2]
。这表示每个月的兔子对数等于前一个月和前两个月兔子对数之和。 - 循环:从第三个月开始逐月计算,直至第
n
个月
这种方法主要是避免了递归带来的性能问题,效率更高。