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

网上看到这个题目,直接看到答案,不是很理解,还是按照自己梳理了一遍。

首先,我先搞了一个二维数组,3个数字记录每个月状态是新生的兔子,2个月大的兔子,3个月大的兔子,

public static int test0() {
		int i = 0;
		int m = 20;
		int[][] a = new int[20][3];
		a[0][0] = 1;// 新出生的兔子
		a[0][1] = 0;// 2个月的兔子
		a[0][2] = 0;// 3个月的兔子

		for (int n = 1; n < m; n++) {
			a[n][0] = a[n - 1][1] + a[n - 1][2];// 刚出生的兔子,上个月状态是第二个月的兔子+第三个月的兔子
			a[n][1] = a[n - 1][0];// 状态是第二个月的兔子 = 上个月1个月的兔子
			a[n][2] = a[n - 1][1] + a[n - 1][2];// 状态是三个月的兔子=上个月2个月的兔子+上个月三个月的兔子
			System.err.println("第" + (n+1) + "个月的兔子为:" + (a[n][0] + a[n][1] + a[n][2]));
		}

		return i;
	}

此上算出来

第 1 月份,兔子的数量为: 1
第 2 月份,兔子的数量为: 1
第 3 月份,兔子的数量为: 2
第 4 月份,兔子的数量为: 3
第 5 月份,兔子的数量为: 5
第 6 月份,兔子的数量为: 8
第 7 月份,兔子的数量为: 13
第 8 月份,兔子的数量为: 21
第 9 月份,兔子的数量为: 34
第 10 月份,兔子的数量为: 55
第 11 月份,兔子的数量为: 89
第 12 月份,兔子的数量为: 144
第 13 月份,兔子的数量为: 233
第 14 月份,兔子的数量为: 377
第 15 月份,兔子的数量为: 610
第 16 月份,兔子的数量为: 987
第 17 月份,兔子的数量为: 1597
第 18 月份,兔子的数量为: 2584
第 19 月份,兔子的数量为: 4181
第 20 月份,兔子的数量为: 6765


发现第三个月等于第一个月+第二个月

依次内推,可以吧算法写成

/**
	 * 这是分析数字结构的结果,等于前一个月+前2个月
	 */
	public static void test1() {
		for (int i = 1; i <= 20; i++) {
			int num = getNum(i);
			System.out.println("第 " + i + " 月份,兔子的数量为: " + num);
		}
	}

	/**
	 * 获取前2个数字相加,
	 * 
	 * @param i
	 * @return
	 */
	public static int getNum(int i) {
		if ((i == 1) || (i == 2)) {
			return 1;
		} else {
			return getNum(i - 1) + getNum(i - 2);
		}
	}


如果吧3改成2,2个月就生的话,

/**
	 * 如果第2个月就生,那么就是1,2,4,8,可以直接上个月数字*2
	 */
	public static int test2() {
		int i = 0;
		int m = 20;
		int[][] a = new int[20][2];
		a[0][0] = 1;// 新出生的兔子
		a[0][1] = 0;// 2个月的兔子
	

		for (int n = 1; n < m; n++) {
			a[n][0] = a[n - 1][0] + a[n - 1][1];// 
			a[n][1] = a[n - 1][0] + a[n - 1][1];;// 
			
			System.err.println("第" + (n+1) + "个月的兔子为:" + (a[n][0] + a[n][1] ));
		}

		return i;
	}

这样就是双倍放大。。。。。







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值