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

  • 递归算法问题
    有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?(输入月份。分别输出每个月兔子的数量。)

  • 分析

    斐波那契数列。即:从第三个月开始,本月的兔子对数刚好等于前两个月兔子对数的总数。
    古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?_第1张图片

  • Java代码,实现方法1:
    古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?_第2张图片

/**
	 * 题目1:计算兔子的数量 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子, 小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,
	 * 问每个月的兔子对数为多少? 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
	 * 
	 * @param month 经过多少月以后
	 */
	public static void calRabit(int month) {
		// 定义一个数组,用来存放每个月兔子的数量
		long[] rabitsArray;
		// 数组的长度为月份的长度
		int arrayLength = month;
		rabitsArray = new long[arrayLength];
		// 第一和第二个月的兔子都是:1
		if (rabitsArray.length >= 1) {
			rabitsArray[0] = rabitsArray[1] = 1;
		}
		// 循环计算并分别输出每个月兔子的数量
		for (int i = 0; i < rabitsArray.length; i++) {
			if (i == 0 || i == 1) {
				System.out.println("这是第 : " + (i + 1) + "个月\t兔子数量为 : " + rabitsArray[i]);
			} else {
				// 第三个月以后都满足规律:从第三个月开始,每个月兔子的数量刚好等于前两个月兔子数量之和
				rabitsArray[i] = rabitsArray[i - 2] + rabitsArray[i - 1];
				System.out.println("这是第 : " + (i + 1) + "个月\t兔子数量为 :" + rabitsArray[i]);
			}
		}
	}
  • Java代码实现,方法2
    古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?_第3张图片
/**
	 * 通过方法本身回调,输出键入的月份所有的兔子数量
	 * 
	 * @param month 需要输出几个月后的兔子数量
	 * @return 返回month个月后兔子的数量
	 */
	public static int calRabit2(int month) {
		if (month == 1 || month == 2) {
			// 若month==1或2,返回1,并结束回调
			return 1;
		}
		// 上一个月的兔子数(回调本身,计算上一个月兔子的数量)
		int rabit1 = calRabit2(month - 1);
		// 上一个月的前一个月兔子数(回调本身,计算上两个月兔子的数量)
		int rabit2 = calRabit2(month - 2);
		// 返回当前月的兔子数量
		return rabit1 + rabit2;
	}

注:该方法不能用于在main()函数的循环结构中调用,否则会报出堆栈溢出异常。
在这里插入图片描述

你可能感兴趣的:(循环编程题)