兔子数列 - C语言

兔子数列

兔子数列的起源

公元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;
}

示例:
兔子数列迭代版本示例

运行结果

运行结果:
运行结果
兔子数列你了解了吗!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值