递归和非递归分别实现求第n个斐波那契数

递归和非递归

文章目录

  • 递归
  • 非递归


前言

斐波那契数列(Fibonacci sequence)是一个非常有名的数列,由 Leonardo Fibonacci 在 13 世纪初引入,用于描述兔子繁殖的问题。该数列的定义如下:

  • 第 1 项为 1;
  • 第 2 项为 1;
  • 从第 3 项开始,每一项都等于前两项之和。

因此,斐波那契数列的前几项分别为 1、1、2、3、5、8、13、21、34、55、89、144、233、377……

斐波那契数列具有很多特殊的性质,例如:

  1. 其比值趋近于黄金分割值(约为 1.618),即相邻两项的比例趋近于这个值。
  2. 满足很多数学和自然规律,如菜叶的排列、植物的组织形态等等。
  3. 使用递归的方式计算了斐波那契数列的第 n 项。但需要注意的是,当输入较大的数时(如 n >= 45),该程序的运行时间将变得非常长,因为每次递归调用都会重复计算之前已经求解过的值。

    因此,为了提高该程序的效率,可以考虑使用循环来代替递归,或者使用数组来记录之前已经计算过的值,以避免重复计算。


一、递归

代码如下(示例):

int fib(int a)
{
    if (a == 1 || a == 2)
        return a;
    else
        return fib(a - 1) + fib(a - 2);
}
int main()
{
    int a = 0;
    scanf("%d", &a);
    int ret=fib(a);
    printf("%d", ret);
    return 0;
}

二 非递归

//递归和非递归分别实现求第n个斐波那契数
int fib(int a)
{
    int i = 0;
    int f1 = 1;
    int f2 = 1;
    int f3 = 0;
    if (a == 1 || a == 2)
        return 1;
    for (i = 3; i <= a; i++)
    {
        f3 = f1 + f2;
        f1 = f2;
        f2 = f3;
    }
    return f3;
}
int main()
{
    int a = 0;
    scanf("%d", &a);
    int ret=fib(a);
    printf("%d", ret);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值