斐波那契数列的扩展应用及C++程序实现(探索者校刊)
[日期:2019-06-03] | 作者:信息技术 次浏览 | [字体:大 中 小] |
2021届11班 高范铖旭 指导教师:付秀军
首先我们来看一组数列:
1、1、2、3、5、8、13、21、34、55、89、144、233、377······
相信同学们一定对这组数列非常熟悉,这就是大名鼎鼎的斐波那契数列。斐波那契数列,又称黄金分割数列。在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从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-1或n-2或n-3阶楼梯,所以到第n阶楼梯的方法总数就等于到第n-1阶与到n-2阶与到n-3阶楼梯的方法之和,用数学语言将其表示出来即是:
这一类问题用C++程序实现比较方便。
问题描述:如果一开始给你b只幼兔,兔子p(p≥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;
}