古典问题:关于兔子的生命周期。

面试题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?


package com.collection;

import java.util.Arrays;


public class RecursiveDemo {
	public static void main(String[] args) {
		/**
		 *	有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一
		 *对兔子,假如兔子都不死,问每个月的兔子总数为多少?
		 *
		 *已知开始已有一对兔子(A),
		 *	第1个月:A兔子  =1对
		 *	第2个月:A兔子 =1对
		 *	第3个月:大兔子A生了小兔子B =2对
		 *	第4个月:大兔子A生了小兔子C,  A+B+C=3对。。      	 	注:兔子满3个月后,就每月都生一对。
		 *	第5个月:大兔子A生了小兔子D,大兔子B(满3个月)生了小兔子E。  A+B+C+D+E=5对。
		 *	第6个月:大兔子A生了小兔子F,大兔子B生了小兔子G,大兔子C生了小兔子H。	A+B+C+D+E+F+G+H= 8对
		 *	.....
		 *	规律:1,1,2,3,5,8...
		 *		从第3位开始的数之和来自前两位。
		 */
		
		//已知数据。
		int num = 1;
		int two = 1;
		/**	
		 * 	第1个月
		 * 		num=1,two=1
		 *  第2个月
		 *  	num=1,two=2	
		 *  第3个月
		 *  	num=2,two=3
		 *  第4个月
		 *  	num=3,two=5
		 *  第5个月
		 *  	num=5,two=8
		 *  规律发现:num是以前的two,而two是等于之前num+two。
		 */
		for(int x = 3;x <= 20;x++)
		{ 
			int temp = two;//记录之前two
			two = num+two;//将前num与two相加等于two,
			num = temp;//再将之前的tow赋给num
			System.out.println(num+"***"+two);
		}
		System.out.println("count="+two);
		/**
			1***2
			2***3
			3***5
			5***8
			8***13
			13***21
			21***34
			34***55
			55***89
			89***144
			144***233
			233***377
			377***610
			610***987
			987***1597
			1597***2584
			2584***4181
			4181***6765
		 */
		int[] arr = new int[20];
		arr[0] = 1;
		arr[1] = 1;
		for(int x = 2; x < arr.length;x++)
		{
			/**
			 * 	x = 2:表示第3月
			 * 		arr[2] = arr[0] + arr[1];		//此时数组数量为:arr[0] = 1,arr[1] = 1,arr[2] = 2
			 *  x = 3:表示第4月
			 * 		arr[3] = arr[2] + arr[1];		//此时数组数量为:arr[0] = 1对,arr[1] = 1对,arr[2] = 2对,arr[3] = 3对
			 * x = 4:表示第5月
			 * 		arr[4] = arr[3] + arr[2];		//此时数组数量为:arr[0] = 1对,arr[1] = 1对,arr[2] = 2对,arr[3] = 3对  ,arr[4] = 5对
	  		 * x = 5:表示第6月
			 * 		arr[5] = arr[4] + arr[3];		//此时数组数量为:arr[0] = 1对,arr[1] = 1对,arr[2] = 2对,arr[3] = 3对  ,arr[4] = 5对,arr[5] = 8对  
			 * x = 6:表示第7月
			 * 		arr[6] = arr[5] + arr[4];		//此时数组数量为:arr[0] = 1对,arr[1] = 1对,arr[2] = 2对,arr[3] = 3对  ,arr[4] = 5对,arr[5] = 8对,,arr[6] = 13对
			 */
			arr[x] = arr[x-1] + arr[x-2];//3月=第3-1月+第3-2月 		 4月=第4-1月+第4-2月
		}
		System.out.println("count="+arr[arr.length-1]);
		
		//递归实现
		System.out.println("count="+rec(20));
	}
	/**
	 * 	递归特点:先分解,再合并!
	 * 	1,1,2,3,5,8,13
	 */
	public static int rec(int i) {
		if(i==1 || i==2)
			return 1;
		else
			return rec(i-1)+rec(i-2);
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值