问题描述
有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?
输入描述:
输入int型表示month
输出描述:
输出兔子总数int型
示例
示例1
输入 9
输出 34
解决思路
分析
问题的关键在找规律,直接看题目会以为是一道毫无规律的数学题,但是通过列举,会发现可循的规律。
方法
月份 | 1个月 | 2个月 | 3个月 | 总数 |
---|---|---|---|---|
1 | 1 | 0 | 0 | 1 |
2 | 0 | 1 | 0 | 1 |
3 | 1 | 0 | 1 | 2 |
4 | 1 | 1 | 1 | 3 |
5 | 2 | 1 | 2 | 5 |
6 | 3 | 2 | 3 | 8 |
规律:个数=上两个月份之和(类似爬楼梯问题)
转换成公式:f(n) = f(n-1) + f(n-2),类似爬楼梯问题
- 通过递归实现
- 通过while循环实现
代码实现
// 思路1实现
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int a = in.nextInt();
System.out.println(getRabbit2(a));
}
}
public static int getRabbit(int month) {
if (month <= 2) {
return 1;
}
return getRabbit(month - 1) + getRabbit(month - 2);
}
}
// 思路2实现
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int a = in.nextInt();
System.out.println(getRabbit2(a));
}
}
public static int getRabbit2(int month) {
int one = 1;
int two = 1;
while (month > 2) {
two = one + two; // 记录f(n) ==> f(n) = f(n-2) + f(n-1)
one = two - one; // 记录f(n-1) ==> f(n-1) = f(n) - f(n-2)
month--;
}
return two;
}
}
小伙伴如果想测试的话,可以直接到牛客网这个链接做测试