C语言中斐波那契数列的三种实现方式(递归、循环、矩阵)

C语言中斐波那契数列的三种实现方式(递归、循环、矩阵)

斐波那契数列是指数列:1、1、2、3、5、8、13、21、…… 在数学上,斐波那契数列是以递归的方法来定义的,首两项为 1,之后每一项都是其前两项之和,即:
F(1) = 1, F(2) = 1
F(n) = F(n-1) + F(n-2) , n > 2

递归实现

递归是最贴近人类思维的一种算法实现方式,同时,也是易于理解、易于调试的一种方式。

递归实现斐波那契数列代码如下:

int fibonacci_recursion(int n) {
    if (n <= 1) {
        return n;
    } else {
        return fibonacci_recursion(n-1) + fibonacci_recursion(n-2);
    }
}

该方法的时间复杂度为O(2^n),存在重复计算,容易造成栈溢出问题,因此在实际使用中需谨慎。

循环实现

循环实现方式通过定义两个变量a和b,每次循环将a和b的值依次赋值为b、a+b,实现了斐波那契数列的计算。

循环实现代码如下:

int fibonacci_loop(int n) {
    int a = 0, b = 1, sum;
    for(int i = 0; i < n; i++){
        sum = a + b;
        a = b;
        b = sum;
    }
    return a;
}

矩阵实现

矩阵实现方式是一种高效的斐波那契数列计算方式。该方法通过矩阵乘法的运算来计算每一项的值,时间复杂度达到了O(logn)的级别。

矩阵实现代码如下:

void matrix_multiply(long long a[][2], long long b[][2]) {
    long long m = a[0][0] * b[0][0] + a[0][1] * b[1][0];
    long long n = a[0][0] * b[0][1] + a[0][1] * b[1][1];
    long long p = a[1][0] * b[0][0] + a[1][1] * b[1][0];
    long long q = a[1][0] * b[0][1] + a[1][1] * b[1][1];
    a[0][0] = m; a[0][1] = n; a[1][0] = p; a[1][1] = q;
}

int fibonacci_matrix(int n) {
    long long ans[2][2] = {{1, 0}, {0, 1}}; //单位矩阵
    long long base[2][2] = {{1, 1}, {1, 0}}; //转移矩阵
    while (n > 0) {
        if (n & 1) {
            matrix_multiply(ans, base);
        }
        matrix_multiply(base, base);
        n >>= 1;
    }
    return ans[0][1];
}

示例说明

示例一:计算第十项斐波那契数列的值

分别调用三种实现方式的函数,得到第十项斐波那契数列的值如下:

int main() {
    int n = 10;
    printf("递归方式结果:%d\n", fibonacci_recursion(n));
    printf("循环方式结果:%d\n", fibonacci_loop(n));
    printf("矩阵方式结果:%d\n", fibonacci_matrix(n));
    return 0;
}

运行结果:

递归方式结果:55
循环方式结果:55
矩阵方式结果:55

示例二:计算前10项斐波那契数列的值

使用循环方式实现,计算并输出前10项斐波那契数列的值如下:

int main() {
    int n = 10;
    for (int i = 1; i <= n; i++) {
        printf("%d\t", fibonacci_loop(i));
    }
    printf("\n");
    return 0;
}

运行结果:

1       1       2       3       5       8       13      21      34      55      

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中斐波那契数列的三种实现方式(递归、循环、矩阵) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • iOS中输入框设置指定字符输入的方法

    Sure! 下面是关于在iOS中设置指定字符输入的方法的完整攻略,包含两个示例说明。 方法一:使用代理方法 创建一个遵循UITextFieldDelegate协议的类,并将其设置为输入框的代理对象。 class MyTextFieldDelegate: NSObject, UITextFieldDelegate { func textField(_ text…

    other 2023年8月18日
    00
  • C语言的模板与泛型编程你了解吗

    C语言的模板与泛型编程攻略 概述 模板与泛型编程是现代高级编程语言的一个重要特性,旨在提高代码的复用和灵活性。但在C语言中并不直接支持模板和泛型编程,因此需要通过一些技巧和工具去实现相应的功能。本文将针对C语言的模板与泛型编程做详细的讲解。 C语言中的模板 宏定义 宏定义是C语言中实现模板的一种方式,可以通过宏定义来实现泛型编程的功能。 下面是一个示例,定义…

    other 2023年6月26日
    00
  • et后缀是什么文件? 后缀et文件的打开方式

    et后缀是什么文件? 后缀et文件的打开方式攻略 ET后缀通常表示电子表格文件,其中包含了表格、数据和公式等信息。这种文件格式通常与Microsoft Excel相关联,但也可以由其他电子表格软件创建和打开。 要打开ET文件,可以按照以下步骤进行操作: 使用Microsoft Excel打开ET文件:Microsoft Excel是最常用的电子表格软件之一,…

    other 2023年8月5日
    00
  • python编写mqtt的客户端

    以下是关于“Python编写MQTT客户端”的完整攻略,包含两个示例说明。 什么是MQTT MQTT是一种轻量级的消息传递协议,它可以在低带宽和不稳定的网络环境下使用。MQTT协议使用发布/订阅模式,其中客户端可以发布消息到主题,其他客户端可以订阅该主题以接收消息。 Python中的MQTT客户端 Python中有许多MQTT客户端库可供使用,其中最流行的是…

    other 2023年5月9日
    00
  • PPS后缀修改成PPT格式?WINRAR软件轻松搞定

    PPS后缀修改成PPT格式?WINRAR软件轻松搞定攻略 如果你想将PPS(PowerPoint幻灯片演示)文件后缀修改为PPT(PowerPoint演示文稿)格式,你可以使用WINRAR软件来轻松完成。下面是详细的攻略: 步骤一:下载和安装WINRAR软件 首先,你需要下载并安装WINRAR软件。你可以在WINRAR官方网站(https://www.win…

    other 2023年8月5日
    00
  • 为archlinux终端ls不同类型文件设置不同显示颜色

    为Arch Linux终端ls不同类型文件设置不同显示颜色 在Linux终端中,我们经常需要使用ls命令来查看当前目录下的文件列表。默认情况下,ls命令只是简单地列出文件名,没有对不同类型的文件进行区分或者使用不同的颜色进行显示。这对于快速检查文件列表来说并不是特别方便。但是在Arch Linux中,可以很容易地为不同类型的文件设置不同的显示颜色,使得ls命…

    其他 2023年3月28日
    00
  • Java通过反射注解赋值的方法详解

    我会详细讲解“Java通过反射注解赋值的方法详解”的攻略。 一、什么是反射注解赋值? 在Java中,注解是一种可在代码中嵌入的特殊元数据,用于对类、方法、属性等进行说明和编译检查。Java中的反射机制可以在运行时获取类的详细信息,包括类名称、方法名称、属性信息等,还可以动态地调用类中的方法、属性等。 因此,反射注解赋值就是通过Java反射机制,在运行时获取类…

    other 2023年6月25日
    00
  • ffmpeg——关于视频压缩

    ffmpeg——关于视频压缩 在在线视频服务越来越普及的今天,视频压缩已经成为了一个必须要掌握的技能。无论是为了减小视频文件大小以节省带宽,还是为了提高视频播放的流畅性,视频压缩都是不可或缺的一项操作。 而在视频压缩的领域里,FFmpeg 可谓是开源界的瑰宝,它是一套免费的、跨平台的、专业的视频音频处理工具。它支持多种格式的视频压缩和转换,并具有高效性、精确…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部