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日

相关文章

  • jmeter+ant+jenkins自动化测试环境配置搭建过程

    题目要求讲解“jmeter+ant+jenkins自动化测试环境配置搭建过程”的完整攻略,下面是具体的步骤: 1. 安装JMeter JMeter 是一款常用的测试工具,我们需要先安装好。 下载安装包:Apache JMeter 下载 安装 JMeter。 2. 安装 Ant Ant 是一个 Java 应用程序构建系统,相信大家都已经熟悉它。Ant 需要使用…

    other 2023年6月27日
    00
  • Linux查看ip的实例方法

    Sure! Here is a step-by-step guide on how to view IP addresses in Linux, along with two examples: Open a terminal: Press Ctrl + Alt + T to open a new terminal window. Alternatively…

    other 2023年7月30日
    00
  • 详解vue 组件注册

    绝大多数 Vue 项目中,你都需要定义自己的组件。在文档中,Vue 组件被描述为可复用的 Vue 实例,因为它们实际上就是 Vue 实例,接受相同的选项对象 (除了一些根实例特有的选项)。 组件系统是 Vue 的核心特性之一,它使构建大型应用程序变得更加容易。 全局注册组件 在 Vue 应用程序中注册一个全局组件非常简单,只需要调用 Vue.componen…

    other 2023年6月27日
    00
  • 关于git:如何将分支的内容复制到新的本地分支?

    以下是关于“关于Git:如何将分支的内容复制到新的本地分支”的完整攻略,包含两个示例。 如何将分支的内容复制到新的本地分支 在Git中,我们可以使用git checkout命令将分支的内容复制到新的本地分支。以下是关于如何将分支的内容复制到新的本地分支的详细攻略。 1. 使用git checkout命令 使用git checkout命令可以将分支的内容复制到…

    other 2023年5月9日
    00
  • yum安装指定版本的软件包的方法

    yum安装指定版本的软件包的方法 当我们需要安装某个软件包时,我们通常执行如下命令进行安装: yum install packagename 但是,如果我们需要安装某个特定版本的软件包,该怎么办呢? 下面介绍在yum中安装指定版本软件包的方法。 确定软件包版本号 首先,我们需要确定需要安装软件包的版本号。 例如,我们想要安装Nginx 1.18.0版本,则需…

    其他 2023年3月28日
    00
  • 深入理解C++内链接与外链接的意义

    C++中链接分为内部链接和外部链接两种,不同的链接方式会影响程序的可用性和可执行文件的大小。 内部链接 在C++中使用static关键字定义的变量或函数会被编译器标记为具有内部链接,这意味着它们只能在当前编译单元中访问,其他编译单元无法访问这些变量和函数。 内部链接的意义 避免命名冲突:在不同的编译单元中使用相同的变量或函数名可能会引起命名冲突,使用内部链接…

    other 2023年6月26日
    00
  • Win10 20H1慢速预览版19041怎么手动更新?

    当使用 Win10 20H1 慢速预览版19041 时,如果系统没有自动更新到最新版本,可以手动更新。下面是手动更新的完整攻略: 步骤一:检查更新 打开“设置”应用,在左侧导航栏中选择“更新和安全”,然后在右侧窗格中点击“检查更新”。系统会自动检查最新版本的更新是否可用。 步骤二:下载更新 如果有更新可用,会在更新列表中看到可用的更新,点击“下载和安装”按钮…

    other 2023年6月27日
    00
  • 浅谈C# StringBuilder内存碎片对性能的影响

    浅谈C# StringBuilder内存碎片对性能的影响 前言 在使用C#中的StringBuilder类进行字符串拼接的过程中,可能会遇到StringBuilder对象会占用大量内存的情况。这时候,可能会想到使用StringBuilder对象的Clear()方法,将StringBuilder对象的内存垃圾清理掉,以减少内存使用量。但是,这种做法实际上可能会…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部