C语言经典例11-斐波那契数列

1 题目

古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)

2 分析

将该例建立数学模型,规律为1,1,2,3,5,8, 13, 21, 34, 55, 89, 144, …,即下个月是上两个月之和,该模型在数学上称为fibonacci数列,通过这个规律可以构造递归函数,也可以构造非递归函数计算,显然递归函数的效率非常非常低,但是程序简洁明了(不过非递归的也不复杂…),递归公式如下:
在这里插入图片描述

3 实现

3.1 实现1(递归)

#include<stdio.h>
 
int fibonacci(int n) {
    if (n == 1 || n == 2) {
        return 1;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

int main() {
    for (int i = 1; i <= 40; i++) {
        printf("第%d个月个数为%d\n", i, fibonacci(i));
    }
    return 0;
}

3.2 实现2(非递归)

#include<stdio.h>
 
int main() {
    int f1 = 1;
    int f2 = 1;
    int month = 1; // 用于显示月份
    for (int i = 1; i <= 20; i++, month += 2) {
        printf("第%d个月的个数为%d\n", month, f1);
        printf("第%d个月的个数为%d\n", month + 1, f2);
        f1 = f1 + f2;
        f2 = f1 + f2;
    }
    return 0;
}

4 运行结果

1个月的个数为12个月的个数为13个月的个数为24个月的个数为35个月的个数为56个月的个数为87个月的个数为138个月的个数为219个月的个数为3410个月的个数为5511个月的个数为8912个月的个数为14413个月的个数为23314个月的个数为37715个月的个数为61016个月的个数为98717个月的个数为159718个月的个数为258419个月的个数为418120个月的个数为676521个月的个数为1094622个月的个数为1771123个月的个数为2865724个月的个数为4636825个月的个数为7502526个月的个数为12139327个月的个数为19641828个月的个数为31781129个月的个数为51422930个月的个数为83204031个月的个数为134626932个月的个数为217830933个月的个数为352457834个月的个数为570288735个月的个数为922746536个月的个数为1493035237个月的个数为2415781738个月的个数为3908816939个月的个数为6324598640个月的个数为102334155
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个经典算法题,通常被称为斐波那契数列。在C/C++中,可以使用循环或递归来实现该算法。循环实现通常比递归更高效,因为递归会产生额外的调用开销。以下是使用循环实现斐波那契数列C语言代码示: ```c #include <stdio.h> int main() { int n, a = 0, b = 1, c, i; printf("Enter the number of terms: "); scanf("%d", &n); printf("Fibonacci Series: "); for (i = 1; i <= n; i++) { printf("%d, ", a); c = a + b; a = b; b = c; } return 0; } ``` 其中,变量a和b分别存储斐波那契数列中的前两个数,c则为当前数的值,i用于表示当前循环到第几个数,n为用户输入的数列长度。程序中,首先让用户输入数列长度n,然后使用for循环依次输出数列中的每一个数,每次迭代更新a、b和c的值,直到输出完所有数为止。 ### 回答2: 斐波那契数列是指前两个数为1,从第三个数开始每个数都是前两个数之和的数列如:1、1、2、3、5、8、13、21、34…… 这个数列在数学上有很多应用,非常重要。 在C/C++语言中,计算斐波那契数列可以使用迭代或递归的方式进行。其中,递归方式的代码比较简单,但是会导致大量的重复计算,会造成程序效率的降低。 以下是递归方法的示代码: ```c int fib(int n) { if(n<2) return n; else return fib(n-1)+fib(n-2); } ``` 这段代码中,如果输入n小于2,则直接返回n;否则,使用递归的方式计算fib(n-1)和fib(n-2)两个值的和,并将结果返回。虽然代码简单易懂,但是会造成效率较低的问题。 而迭代的方式则可以避免上述问题,在每次计算时只需要计算前两个数的和即可,如下面这个示代码: ```c int fib(int n) { int a = 1, b = 1; for(int i=3; i<=n; i++) { int c = a + b; a = b; b = c; } return b; } ``` 这段代码中,先定义了a和b两个变量,并将它们初始化为1,作为斐波那契数列的前两项,然后通过for循环计算第n个斐波那契数,并返回结果b。 总之,在C/C++中,计算斐波那契数列可以使用递归或迭代的方法,但是要根据实际情况选择合适的方法,以提高效率和减少计算量。 ### 回答3: 斐波那契数列是一个经典的数学问题,在计算机编程中也经常用到。斐波那契数列是这样一个数列:0、1、1、2、3、5、8、13、21、34、……它的特点是每个数都是前两个数之和。如,第三个数是0+1=1,第四个数是1+1=2,以此类推。 计算斐波那契数列可以用递归或循环的方式实现。递归的实现方式相对简单,就是利用函数调用自身的特性计算结果。但是如果使用递归的方式计算斐波那契数列,会造成时间复杂度的增长,导致程序效率低下,容易出现内存泄漏等问题。 因此,一般使用循环的方式来实现斐波那契数列的计算。通过给定第一个数和第二个数,然后依次计算出后续的数。如,假设第一个数为0,第二个数为1,则可以通过以下代码计算前十个斐波那契数列: int n = 10; //要计算的斐波那契数列个数 int a = 0; //第一个数 int b = 1; //第二个数 int c; //存储计算出的数 for(int i = 1; i <= n; i++) { if(i == 1) { printf("%d ", a); } else if(i == 2) { printf("%d ", b); } else { c = a + b; printf("%d ", c); a = b; b = c; } } 上述程序中,先给定要计算的斐波那契数列的个数,然后初始化第一个数和第二个数。接着,通过循环计算出后续的数,将计算出的数存储在变量c中,然后更新a和b的值,继续进行下一次计算。最后,将计算出的数输出到屏幕上。 通过这种循环的方式来实现斐波那契数列的计算,可以避免使用递归导致的时间和空间复杂度过高的问题,提高程序的效率和稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值