习题解析之:兔子繁殖问题
【问题描述】
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,用户输入一个月份数,计算并在一行内输出该月的兔子总对数以及前一个月与本月兔子数量的比值(计算并观察一下这个比值的数值是多少),比值结果保留小数点后3位,数字间用空格分隔。
输入格式
一个大于2的正整数
输出格式
在一行内输出两个数,数之间用空格隔开。
第一个是整数,表示本月的兔子的对数,第二个是浮点数(严格保留小数点后三位),表示前一个月兔子数与本月兔子数的比值。
示例
输入:
5
输出:
5 0.600
【编程思路】
先来分析一下各月的兔子数。
第 1 个月有 1 对兔子;
第 2 个月有 1 对兔子(兔子还在生长,暂不生小兔子);
第 3 个月有 2 对兔子(1 月的老兔子;1 月的老兔子生了一对小兔子);
第 4 个月有 3 对兔子(1 月的老兔子;1 月的老兔子又生了一对小兔子;1 月的老兔子在第 3 个月生的一对小兔子,但这对小兔子还在生长,暂不生小兔子)
第 5 个月有 5 对兔子(1 月的老兔子;1 月的老兔子又生了一对小兔子;1 月的老兔子在第 3 个月生的一对小兔子;这对小兔子生了一对小小兔子;1 月的老兔子在第 4 个月生的一对小兔子,这对小兔子还在生长,暂不生小兔子)
……
更一般地,设第 n 个月的兔子数为 a[n] ,则 a[n] 应该由两部分兔子组成:上个月(第 n - 1月)的所有兔子(有 a[n - 1] 对)在第 n 个月继续活着(兔子都不死),在加上新出生的兔子,第 n - 2 月的每对兔子在第 n 个月都会生一对兔子(每对兔子长到第三个月后每个月又生一对兔子,新生出的兔子有 a[n - 2] 对),因此有
a[n] = a[ n - 1] + a[n - 2]
这就是兔子繁殖的递推公式。
设变量 a 和 b 分别表示两个月的兔子数,初始时,a = 1(第 1 个月有 1 对兔子), b = 1(第 2 个月有 1 对兔子)。
用循环 for i in range(3,n + 1): 按上面的递推公式求第 3 个月到第 n 个月的兔子数。
编写的源程序如下:

浙公网安备 33010602011771号