【编程题】兔子生殖问题(斐波拉契数列)

    十三世纪初,数学家菲波拉契在书中提出一个乐趣的题目:「假设一对兔子成配偶后,在二个月时便可以生下一对(一雌一雄)兔子。以后,每过足一个月可以生下另一对兔子,如果每只兔子都能健康存活,一年之后,会有多少对兔子呢?」 
第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);
		
	}
}

运行结果:


总结:对于这类题目应该动手将每个月的兔子数都列出来,根据数列去找规律,不能一直把目光放在兔子身上,本质是找数列的规律。

猜你喜欢

转载自blog.csdn.net/pcwl1206/article/details/81053769