Java 实现 蓝桥杯 生兔子问题
生兔子问题
有一对兔子,从出生后第四个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子。假如兔子都不死,计算第十个月兔子的总数?
分析:
四个月开始生兔子,则:F(N) = f(n-1)+ f(n-3)。可以运用递归来解决问题。
import java.util.ArrayList;
import java.util.List;
public class 生兔子 {
public static void main(String[] args) {
// System.out.println(f(13));
int n = 13;
int [] num = new int[14];
num[1]=1;num[2]=1;num[3]=1;
for (int i=4;i<=n;i++){
num[i]=num[i-1]+num[i-3];
}
System.out.println(num[n]);
}
public static int f(int n){
if(n==1 || n==2 || n==3){
return 1;
}
// 今年的 = 去年的+今年新出生
//去年的 今年新出生的
return f(n-1) + f(n-3);
}
}
如果当出生后第三个月开始生兔子: F(N) = f(n-1)+ f(n-2)
今年的总数=去年的总数+今年的新出生的兔子,
而今年新出生的兔子=今年成熟了的兔子数量(每只成熟的兔子生一只小兔),
那今年成熟了的兔子数量又是什么呢?其实就是前年的兔子总数,因为前年的兔子,不管几岁,到今年一定成熟,可以生新兔子了。而去年的没有成熟,不能生兔子。
所以今年的总数=去年的总数+前年的总数。
F(n)=F(n-1)+F(n-2)。
这个数列就是1、1、2、3、5、8、13、21、34、……
在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
(按照上面的改一下就好了)
烦人的来了
但是就有这么一个问题:兔子也会死
出生到死亡只有三年,即n年出生,n+3年死去。
出生一年以后可以生育,也就是n+1年开始生育,一年可以生一只宝宝。
这时我们换一个思路:
定义f(n)为第n年新出生的动物个数,则f(n)=f(n-1)+f(n-2),前两项为1,而每年的总数也就是三项求和而已。
每年出生的数量为1,1,2,3,5,8,13,21
每年兔子的总数是 1,2,4,6,10,16,26,42