十三世纪初,数学家菲波拉契在书中提出一个乐趣的题目:「假设一对兔子成配偶后,在二个月时便可以生下一对(一雌一雄)兔子。以后,每过足一个月可以生下另一对兔子,如果每只兔子都能健康存活,一年之后,会有多少对兔子呢?」
第1个月:只有一对兔子a。
第2个月:仍只一对兔子a。
第3个月:a生下一对兔子b,共有2对兔子。
第4个月:a又生下一对兔子c,加上一对兔子b,共有3对兔子。
第5个月:a又生下一对兔子d,而这对兔子b也生下一对兔子e,加上一对兔子c,共有5对兔子。
第6个月:a又生下一对兔子f,而这对兔子c也生下一对兔子g,同时这对兔子b也生下一对兔子h,加上一对兔子d和一对兔子e,共有8对兔子。
如此下去,每个月兔子的成对个数分别是1,1,2,3,5,8,13,21,.......。这数列我们称之为斐波拉契数列。 如果斐波拉契数列的第n项以fn表示,则 f(n+1) = f(n)+(n-1)。
第1个月:只有一对兔子a。
第2个月:仍只一对兔子a。
第3个月:a生下一对兔子b,共有2对兔子。
第4个月:a又生下一对兔子c,加上一对兔子b,共有3对兔子。
第5个月:a又生下一对兔子d,而这对兔子b也生下一对兔子e,加上一对兔子c,共有5对兔子。
第6个月:a又生下一对兔子f,而这对兔子c也生下一对兔子g,同时这对兔子b也生下一对兔子h,加上一对兔子d和一对兔子e,共有8对兔子。
如此下去,每个月兔子的成对个数分别是1,1,2,3,5,8,13,21,.......。这数列我们称之为斐波拉契数列。 如果斐波拉契数列的第n项以fn表示,则 f(n+1) = f(n)+(n-1)。
package 经典编程题;
/**
* 2018.07.15
* @author PC
*问题:有一对兔子,从出生后第三个月起每个月都生一对小兔子,小兔子长到第三个月以后每个月又生一对兔子。
*假如兔子都不死,问每个月的兔子总数是多少?
*/
public class 兔子生殖问题 {
//这是一个斐波拉契数列问题
public static void sumRabbit(int M){
System.out.println("第" + 1 + "个月的兔子总数为:" + 2);
System.out.println("第" + 2 + "个月的兔子总数为:" + 2);
int rab1 = 1; //rab1是第(n-1)个月兔子的总对数
int rab2 = 1; //rab2是第(n)个月兔子的总对数
int rab; //rab为临时变量
for(int i=3; i<=M; i++){
//斐波拉契数列: f(n+1) = f(n)+(n-1)
rab = rab2;
rab2 = rab1 + rab2;
rab1 = rab;
System.out.println("第" + i + "个月的兔子总数为:" + 2*rab2);
}
}
//测试
public static void main(String[] args){
sumRabbit(10);
}
}
运行结果:
总结:对于这类题目应该动手将每个月的兔子数都列出来,根据数列去找规律,不能一直把目光放在兔子身上,本质是找数列的规律。