兔子繁殖问题

兔子繁殖问题的递归与循环算法

兔子繁殖问题

问题描述

兔子繁殖问题:假定一对大兔子每月能生一对小兔子,且每对新生的小兔子经过一个月可以长成一对大兔子,具备繁殖能力,如果不发生死亡,且每次均生下一雌一雄,问一年后共有多少对兔子?
这个问题是今天群里的打卡问题,把我自己的思路摆上来,然后用递归和循环的方式分别实现。

思路和代码

这里如果往深里想,很容易犯晕,我们做这样的规定:每对兔子都是月初出生,月底长成,本月新生的兔子不会繁殖。依据这个规定,按照月份、小兔子的对数、成熟兔子的对数列个表格(前6个月的,月初统计)。

统计1月2月3月4月5月6月
小兔子对数011235
成熟兔子对数112358
合计1235813

观察一下,小兔子、成熟兔子、合计均是一个斐波那契数列。区别就是初始值不一样。列表到这里其实就可以写代码了。参考今天的递归,可以很方便的写出递归形式的代码:

int young_rabbit_rec(int n) //recursion way
{
	if (1 == n)
		return 0;
	else if (2 == n)
		return 1;
	else
		return young_rabbit_rec(n - 1) + young_rabbit_rec(n - 2);
}

int mature_rabbit_rec(int n) //recursion way
{
	if (n >= 3)
		return mature_rabbit_rec(n - 1) + mature_rabbit_rec(n - 2);
	else
		return 1;

}

关于初值,使用分支语句处理即可。有了递归方法,循环方法也很容易就可以写出来:

int young_rabbit(int n)//loop way
{
	if (1 == n)
	{
		return 0;
	}
	if (2 == n)
	{
		return 1;
	}
	int a = 0;
	int b = 1;
	int c = 1;
	while (n >= 3)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}

int mature_rabbit(int n)//loop way
{	
	int a = 1;
	int b = 1;
	int c = 1;
	while (n >= 3)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}

为了验证是否和预期一致:

int main()
{
	int month = 0;
	while (scanf("%d", &month) != EOF)
	{
		int i = 0;
		printf("=============循环实现==============\n");
		printf("\n");
		for (i = 1; i <= 12; i++)
		{
			printf("第%d月共有%d对小兔子,%d对大兔子。\n", i, young_rabbit(i),mature_rabbit(i));
			printf("第%d月共有%d对兔子。\n",i, young_rabbit(i) + mature_rabbit(i));
			printf("\n");
		}
		printf("=============递归实现==============\n");
		printf("\n");
		for (i = 1; i <= 12; i++)
		{
			printf("第%d月共有%d对小兔子,%d对大兔子。\n", i, young_rabbit_rec(i), mature_rabbit_rec(i));
			printf("第%d月共有%d对兔子。\n", i, young_rabbit_rec(i) + mature_rabbit_rec(i));
			printf("\n");

		}

	}

	return 0;
}

运行结果

在这里插入图片描述

### Java实现斐波那契序列解决兔子繁殖问题 斐波那契数列是一种经典的数学模型,常用于描述兔子繁殖问题。以下是基于Java语言的一种解决方案[^1]。 #### 解决方案分析 在该问题中,假设每个月每对成熟的兔子都会一对兔子,并新生兔子需要一个月的时间才能成熟并开始育。初始条件为第一个月一对兔子,第二个月仍然是一对兔子。从第三个月起,每月兔子总数等于前两个月兔子总数之和。 通过观察可以发现,这正是斐波那契数列的核心特性:当前项等于前两项之和。因此可以通过迭代的方式计算出任意月份的兔子数量。 #### 实现代码 以下是一个完整的Java程序,能够计算指月份的兔子总对数: ```java import java.util.Scanner; public class RabbitFibonacci { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入要查询的月份:"); int month = scanner.nextInt(); if (month <= 0) { System.out.println("输入的月份不合法!"); return; } // 初始化前两个月的数量 int num1 = 1, num2 = 1; if (month == 1 || month == 2) { System.out.println("第" + month + "个月的兔子数量为:" + num1 + "对"); } else { for (int i = 3; i <= month; i++) { int temp = num1 + num2; // 计算下一项 num1 = num2; // 更新前一项 num2 = temp; // 更新当前项 } System.out.println("第" + month + "个月的兔子数量为:" + num2 + "对"); } scanner.close(); } } ``` #### 代码说明 1. 使用`Scanner`类接收用户输入的目标月份。 2. 义变量`num1`和`num2`分别表示前两个月的兔子数量,初始均为1。 3. 如果目标月份小于等于2,则直接返回1对兔子。 4. 对于于2的月份,利用循环逐步计算后续各月的兔子数量,直到达到目标月份为止。 5. 输出最终结果。 此方法时间复杂度为O(n),空间复杂度为O(1)[^2]。 --- #### 示例运行结果 假设计算第6个月的兔子数量: ``` 请输入要查询的月份:6 第6个月的兔子数量为:8对 ``` --- #### 注意事项 - 输入的月份应为正整数,否则需提示错误信息。 - 若涉及更范围的数据运算(如超过几个月),可能需要考虑数据类型的溢出风险,可选用`BigInteger`替代基本数据类型。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值