CPP学习之——兔子繁殖问题(14.9)

一 概述

看过电影《达芬奇密码》的朋友可能会听到斐波那契数列,斐波那契数列是由意大利数学家列昂纳多.斐波那契发明的。在他的代表作《算盘书》中,斐波那契提出了这样的问题:

有小兔一对,若在它们出生后第一个月成年,第二个月就有生殖能力,而有生殖能力的一对兔子每一个月都生一对兔子。设所生的一对兔子均为一雌一雄,且均无死亡。问新生的一对兔子一年后可以繁殖成多少对兔子?

二 分析

  • 期初,有一对兔子;第一个月,仍有一对兔子;第二个月,这对兔子生育了一对兔子,那么就有两对兔子;第三个月,由于有生育能力的一对兔子每个月都生一对兔子,那么有三对兔子;第四个月,第二个月时生产的那对兔子长大并且有了生育能力,因此一对小兔生育一对兔子再加上大兔子生育一对兔子,总共是有五对兔子;第五个月,大兔子在第三个月生育的那对兔子也有了生育能力,因此三对兔子又生育了三对兔子,再加上第四个月时兔子的总数五只,总共是有八对兔子。。。把这些对数顺序排列起来,可得到下面的数列: 1,1,2,3,5,8,13...

  • 观察这一数列,可以看出:从第二个月起,每月兔子的对数都等于前两个月对数的和。根据这个规律,推算出一年后养兔子的总对数。

    经过月数:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12

    兔子对数:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233

  • 所以这个养图人公有233对兔子

三 程序设计

  • 假如我们用数组来表示的话,一年后兔子的对数为a[13],因为第一个元素要保存兔子的初始值,而后12个元素要保存12个月的兔子对数,因此我们设置数组a为13个元素,我们知道兔子的初始对数是一对,而第一个月兔子又没生育,那么a[0]和a[1]的值均为1(对)
  • 由于从第二个月起,每个月兔子的对数都等于前两个月对数的和。因此:a[n]=a[n-1]+a[n-2];其中n为月份,n-1表示第n月时的前一个月,n-2表示第n月时的前两月,那么a[n-1]就表示第n月时前一个月的兔子对数,而a[n-2]就表示第n月时前两个月的兔子对数。把这两个月的兔子对数相加就是第n月的兔子对数。
  • 例如:在第三个月时,n的值为3,那么该式子为:a[3]=a[3-1]+a[3-2],a[3-1]也就是a[2],a[3-1]也就是a[1],我们知道第二个月的兔子对数是2,第一个月的兔子对数是1,因此a[2]的值是2,a[1]的值是1,把这两个数组元素相加,得出3,也就是第三个月的兔子对数a[3]的值
  • 我们从上列中得知数组a的第一个元素和第二个元素为1,即a[0]=a[1]=1,因此我们在定义数组时要初始化开头两个元素:int a[13]={1,1}

四 示例演示及结果输出

4.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
using namespace std;
int main()
{
int a[13]={1,1};
int n;
for(n=2;n<13;n++)
{
a[n]=a[n-1]+a[n-2];
//cout<<a[n]<<endl;
}
cout<<a[12]<<endl;
return 0;
}

4.2 输出结果

1
233