C语言入门——求斐波那契数

        斐波那契数列,又称黄金分割数列,因数学家莱昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……斐波那契数列:前两个数之和等于第三个数

根据以上描述,我们可以得出求斐波那契数的公式:

Fib(n)=\begin{cases} & \text{ 1} {\, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, \, }n\leq 2 \\ & \text{ \textit{Fib}(n-1)+\textit{Fib}(n-2)} n>2 \end{cases}

有了以上公式,求斐波那契数我们可以用递归实现,如:我们要求斐波那切数列的第n个数,可以用以下代码实现:

#include <stdio.h>
int Fib(int n)
{
    if (n <= 2)
        return 1;
    else
        return (Fib(n - 1) + Fib(n - 2));
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    int ret = Fib(n);
    printf("%d\n", ret);
    return 0;
}

我们求第9菲波那切数,其运行结果如下:

但是如果我们用以上代码求菲波那切数列的第50个数的话,该代码至少要运行3分钟以上(虽然结果是错误的,因为第50个斐波那契数已经超出了int的范围),所以其效率太低,究其原因是什么呢?

我们会发现在递归的时候,会进行大量重复的计算,例如我们要求\textit{Fib}(6),则需要求5次\textit{Fib}(2)

在以上代码我们设置一个计数器count,我们统计一下在求第40个斐波那契数的过程中,会计算多少次第3个斐波那契数?

#include <stdio.h>
int count = 0;
int Fib(int n)
{
    if (n == 3)
    {
        count++;
    }
    if (n <= 2)
        return 1;
    else
        return (Fib(n - 1) + Fib(n - 2));
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    int ret = Fib(n);
    printf("%d\n", ret);
    printf("count = %d\n", count);
    return 0;
}

我们看到count=39088169,可以看到进行了大量重复的计算!

因此,我们可以考虑使用迭代来计算,设置3个变量a、b、c,前两个分别是数列的前两个值1、1,当要求第n(n>=2)个数的时候,设置循环,把前两变量的和放到c中,把b的值赋给a,再把c的值赋给b,最终c里面存放的就是要求的结果

#include <stdio.h>
int Fib(int x)
{
    int a = 1;
    int b = 1;
    int c = 1;
    while(x > 2)
    {
        c = a + b;
        a = b;
        b = c;
        x--;
    }
    return c;
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    int ret = Fib(n);
    printf("%d\n",ret);
    return 0;
}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 斐波数列是一个非常著名的数列,它的前两项为和1,从第三项开始,每一项都是前两项的和。C语言中可以使用函数来斐波数列中的某一项,具体实现方法如下: ```c #include <stdio.h> int fibonacci(int n) { if (n == || n == 1) { return n; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } int main() { int n; printf("请输入要斐波数列的项数:"); scanf("%d", &n); printf("第%d项的值为:%d\n", n, fibonacci(n)); return ; } ``` 在上面的代码中,我们定义了一个名为fibonacci的函数,它的参数n表示要斐波数列的项数。如果n等于或1,直接返回n;否则,递归地调用fibonacci函数,出前两项的和,即为第n项的值。在主函数中,我们通过scanf函数获取用户输入的n值,然后调用fibonacci函数出第n项的值,并通过printf函数输出结果。 需要注意的是,由于递归调用fibonacci函数的过程中会产生大量的重复计算,因此当n较大时,程序的效率会非常低下。为了提高效率,可以使用循环或者动态规划等方法来斐波数列。 ### 回答2: C语言是一种广泛使用的编程语言,其语法简单、结构清晰、功能强大,应用广泛。Fibonacci数列是一种特殊的数列,其特点是前两个数相加等于第三个数,如1,1,2,3,5,8,13,21…… 要用C语言编写函数Fibonacci数列,可以使用递归和循环两种方法。 一、递归方法: 在C语言中,递归方法是一种将问题分解成更小的子问题并进行解决的方法。在Fibonacci数列时,可以将其分解成两个部分:前面的数加上它之前的一个数等于后一个数。 以下是递归方法的代码: int fibonacci(int n) { if (n == 0 || n == 1) { return n; } return fibonacci(n-1) + fibonacci(n-2); } 该函数会递归调用自身,解Fibonacci数列。在该代码中,有两个边界条件:当n等于0或1时,返回n,否则,返回前两个数的和。 二、循环方法: 在C语言中,可以使用循环来解Fibonacci数列,可以使用for、while、do while等语句进行实现。以下是使用for循环实现的代码: int fibonacci(int n) { int a = 0, b = 1, c, i; if (n == 0 || n == 1) { return n; } for (i = 2; i <= n; i++) { c = a + b; a = b; b = c; } return b; } 该函数会使用for循环来计算Fibonacci数列,首先定义三个变量a、b、c,分别表示数列中的前两个数和当前数。如果n等于0或1,直接返回n,否则使用for循环计算数列中的当前数。在每次循环中,将前两个数相加,得到当前数,同时将a、b的值进行更新。 总结: 使用递归和循环两种方法,都可以实现解Fibonacci数列。递归方法适用于解小规模的数列,而循环方法则适用于解大规模的数列。对于初学者而言,建议使用循环方法,因为它的执行效率更高。在程序设计中,应根据实际情况选用最适合的方法。 ### 回答3: Fibonacci数列是一种数学序列,其前两个数为0和1,第n个数为前两个数之和,即F(n)=F(n-1)+F(n-2)。因此,Fibonacci数列可以用递归函数或迭代函数来解。 在C语言中,我们可以使用递归函数来解Fibonacci数列。以下是一个使用递归函数的示例代码: ```c #include <stdio.h> int fibonacci(int n) { if (n == 0 || n == 1) { return n; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } int main() { int n; printf("请输入一个正整数n:"); scanf("%d", &n); printf("Fibonacci数列第%d项为:%d", n, fibonacci(n)); return 0; } ``` 在上面的代码中,函数`fibonacci`使用递归的方式来计算Fibonacci数列的第n个数。如果n为0或1,则直接返回n。否则,递归地计算F(n-1)和F(n-2)的值并返回它们的和。 接下来,我们将介绍使用迭代函数来计算Fibonacci数列的方法。以下是一个使用迭代函数的示例代码: ```c #include <stdio.h> int fibonacci(int n) { int a = 0, b = 1, c, i; if (n == 0) { return a; } for (i = 2; i <= n; i++) { c = a + b; a = b; b = c; } return b; } int main() { int n; printf("请输入一个正整数n:"); scanf("%d", &n); printf("Fibonacci数列第%d项为:%d", n, fibonacci(n)); return 0; } ``` 在上面的代码中,函数`fibonacci`使用迭代的方式来计算Fibonacci数列的第n个数。我们使用三个变量a、b和c来保存前两个数和它们的和,每次循环更新它们的值,直到计算出第n个数为止。 以上是使用函数来解Fibonacci数列的两种方法。需要注意的是,递归函数由于会重复计算一些数值,可能会比迭代函数慢一些。因此,在实际应用中,可以根据具体情况选择适合的算法。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值