有一对可爱的兔子,他们从出生后的第五个月开始,每个月生1对小兔子,新生的小兔子五个月后也会开始生兔子,兔子不会死亡,那么第n个月的时候,会有多少对兔子呢?如第五个月,答案:2对。
首先我们可以写一下由简入难,从第一个月到第四个月都是1对,第五个月开始变成2对,3对,4对,5对,那么第九个月会是6对吗?非也!
第九个月的时候,第五个月出生的1对小兔子。也长大了,迎来了它的第五月,开启了无尽的生娃旅程。所以除了祖宗那1对,又1对加入了生娃大军,所以这个月会增加两对,即变成了7对!
这时候可以发现思路其实非常简单,该月增长的对数,就等于四个月前的那个月的兔子对数。
比方说五月有多少对,九月就增长多少对,五月以后的还没长大,我们应该保存着。
1.队列实现
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
while (reader.hasNextInt()) {
// 第n月
int n = reader.nextInt();
if (n <= 0) {
System.out.println("非法参数");
continue;
}
// 初始兔子1对 与 增伤对数,初始0
int rabbitNum = 1;
int item = 0;
// 队列存前四个月的数量
Queue queue = new LinkedList<Integer>();
// 每次循环的目的是出队四个月前的数量,入队当月数量
for (int i = 1; i <= n; i ++) {
// 1,2,3,4月的前四个月什么都没有,直接入队
if ( i - 4 <= 0){
queue.offer(1);
continue;
}
// 得到四个月前的那个月有多少对
int poll = (Integer)queue.poll();
// 增加兔子的对数
rabbitNum += poll;
// 存入该月对数
queue.offer(rabbitNum);
}
System.out.println("兔子对数:" +rabbitNum);
}
}
2.递归实现
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
System.out.println(total(n));
}
private static int total(int n) {
if (n<=4) {
return 1;
}else {
return total(n-1)+total(n-4);
}
}