斐波那契数列的扩展应用及C++程序实现(探索者校刊)

[日期:2019-06-03] 作者:信息技术 次浏览 [字体: ]

202111班 高范铖旭  指导教师:付秀军

首先我们来看一组数列:

1、123581321345589144233377······

相信同学们一定对这组数列非常熟悉,这就是大名鼎鼎的斐波那契数列。斐波那契数列,又称黄金分割数列。在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以《斐波那契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

现在,我们就来解决两道关于它的难题。

一、兔子繁殖问题

若每只兔子从出生的第三个月开始,每个月都可生出1对兔子,且兔子不会死亡。若现有新生的兔子1只,求第10个月时有多少只兔子?

解:若我们将有生育能力的兔子定义为成兔,暂未有生育能力的兔子定义为幼兔,我们可以通过一张表来发现规律。

月数

1

2

3

4

5

6

7

8

9

10

···

幼兔

1

1

1

2

3

5

8

13

21

34

···

成兔

0

0

1

1

2

3

5

8

13

21

···

总数

1

1

2

3

5

8

13

21

34

55

···

我们可以从中发现,兔子的总数正好构成一个斐波那契数列,所以第十月一共有55只兔子。那么到了第n个月共有多少只兔子呢?

解:根据我们所发现的规律,发现从第三个月开始,每个月的兔子总数都等于前两个月的兔子总数之和,将它用数学语言表示出来即是:


变式:若每只兔子从出生的第三个月开始,每个月都可生出4只兔子,且兔子只能存活4个月。若现有新生的兔子1只,求第n个月时有多少只兔子?

用数学语言将其表示为:


二、上楼梯问题

若有10阶楼梯,一次可以跨1阶或2阶楼梯,那么一共有多少种走法?

解:这里我们运用一下逆向思维,也就是倒着来看这个问题,要走到第10阶,那么我们必须要先走到第9阶或者第8阶,就有了2种方法,即从第9阶跨一阶或从第8阶跨2阶,那方法总数就是到第8阶和到第9阶的方法之和。

变式1:若有n阶楼梯,一次可以跨1阶或2阶楼梯,那么一共有多少种走法?

解:这已经是一个斐波那契数列,再根据之前所做的分析,可以将其一般公式给写出来,即:

变式2:若有n阶楼梯,一次可以跨1阶或2阶或3阶楼梯,那么一共有多少种走法?

解:与之前一样,还是先进行逆推分析。要想到第n阶,则必须先走到第n-1n-2n-3阶楼梯,所以到第n阶楼梯的方法总数就等于到第n-1阶与到n-2阶与到n-3阶楼梯的方法之和,用数学语言将其表示出来即是:


这一类问题用C++程序实现比较方便。

问题描述:如果一开始给你b只幼兔,兔子pp≥2)个月时可生育幼兔,每只可生育d只幼兔,以后的每个月都如此,兔子活到第q(q>p)个月将死亡。问:第n个月时一共有多少只兔子呢?

#include<stdio.h>

#include<stdlib.h>

int main()

{   long long int p,q,n,d,b;

    int i;

    printf("请输入每月生育兔子个数:d\n");  scanf("%lld",&d);

    printf("请输入开始共多少只兔子:b\n");  scanf("%lld",&b);

    printf("请输入可生育月数:p\n");  scanf("%lld",&p);

    printf("请输入死亡月数:q\n");  scanf("%lld",&q);

    printf("请输入求解月数:n\n");  scanf("%lld",&n);

    long long int a[n+q];

    if(n>0&&n<p)

    {for(i=1;i<=n;i++)   a[i]=b;}

    if(n>=p&&n<q)

    {

        for(i=1;i<p;i++)  a[i]=b;

        for(i=p;i<q;i++)  a[i]=a[i-1]+d*a[i-p+1];      

    }

    if(n>=q)

    {

        for(i=1;i<p;i++)  a[i]=b;

        for(i=p;i<q;i++)  a[i]=a[i-1]+d*a[i-p+1];

        for(i=q;i<=n;i++) a[i]=a[i-1]+d*a[i-p+1]-a[i-q+1];     

    }

    printf("共有兔子%lld",a[n]);

return 0;  

}