兔子数列
兔子数列的起源
公元13世纪,在意大利有一位天才的数学家名字叫斐波那契,他在一本《算盘之书》的著作里记载了这样一道数学题:有一对兔子,每一个月可以生下一对小兔子,而且假定小兔子在出生的第二个月便有生育能力,那么过一年后,问一共能有多少对兔子?假设每产一对必须是一雌兔一雄兔,并且所有的兔子都能进行相互交配,所生下来的兔子都能保证成活率。究竟有多少对呢?
我们不妨拿新出生的1对小兔子分析:
第1个月,小兔子①没有繁殖能力,所以还是1对。
第2个月,小兔子①进入成熟期,仍然是1对。
第3个月,兔子①生了1对小兔子②,于是这个月共有2(1+1=2)对兔子。
第4个月,兔子①又生了1对小兔子③。因此共有3(1+2=3)对兔子。
第5个月,兔子①又生了1对小兔子④,而在第3个月出生的兔子②也生下了1对小兔子⑤。共有5(2+3=5)对兔子。
第6个月,兔子①②③各生下了1对小兔子。新生3对兔子加上原有的5对兔子这个月共有8(3+5=8)对兔子。
……
经过分析,这个数列的特点十分明显,从第3个月开始,当月的兔子数=上月兔子数+上上月兔子数。
而这就被称为兔子数列,为了纪念数学家斐波那契,此数列又被称为斐波那契数列。
兔子数列的数学公式
将兔子数列转换成数学公式,如下:
兔子数列的C语言代码
注:代码均未考虑数值溢出。
考虑到兔子数列经常能够使用到,我们这里将其封装成一个函数。而在实现函数之前,我们要先创建函数环境。
兔子数列的函数环境
函数环境:
#include <stdio.h>
int Fib(int );//函数声明
int main()
{
int n = 0;//第n个斐波那契数
scanf("%d", &n);
int ret = Fib(n);//调用函数
printf("ret = %d", ret);//打印结果
return 0;
}
兔子数列函数的具体实现
递归版本
递归版本:
根据上面的数学公式,我们很容易就可以想到用递归的方法实现,递归方法的优点是容易想到,但是缺点也比较明显,效率低下,当n过大时,调用次数过多,计算所需时间过长。
int Fib(int n)//版本1 - 递归版本
{
if (n == 1 || n == 2)
{
return 1;
}
else
{
return (Fib(n - 1) + Fib(n - 2));
}
}
迭代版本
迭代版本:
函数代码如下:
int Fib(int n)//版本2 - 迭代版本
{
int fib1 = 1;//F(1) = 1
int fib2 = 1;//F(2) = 1
int i = 0;
for (i = 2; i < n; i++)//采用迭代的方式
{
int temp = fib2;//借用中间变量记录fib2的值
fib2 = fib1 + fib2;
fib1 = temp;
}
return fib2;
}
示例:
运行结果
运行结果:
兔子数列你了解了吗!