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

yizhihongxing

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日

相关文章

  • PHP递归调用的小技巧讲解

    此处提供一个“PHP递归调用的小技巧讲解”,包括两个示例说明,具体如下: 标题:PHP递归调用的小技巧讲解 什么是递归调用 递归是指一个函数调用自身或者是调用其他的函数,而这个被调用的函数又会调用自身或者其他的函数,以此类推,形成了一种函数调用的层层递进的情况,这被称为递归调用。递归的使用可以帮助递归算法更加简洁明了。 PHP递归调用的小技巧:静态变量 PH…

    other 2023年6月27日
    00
  • 2018苹果WWDC主角还是iOS12 不会发布新硬件

    2018苹果WWDC主角还是iOS12,不会发布新硬件 苹果公司在每年的全球开发者大会上会发布一系列的新产品和更新,其中最受关注的是新版本的iOS系统以及新款的硬件设备。今年的WWDC即将开始,不过有消息称,苹果公司不会发布新的硬件产品,而是会集中力量宣布iOS12系统的新特性和更新。 苹果公司的策略 苹果公司一直以来都非常重视其硬件产品的品质和创新,但是在…

    other 2023年6月26日
    00
  • Spring MVC4.1服务器端推送实现过程解析

    Spring MVC4.1服务器端推送实现过程解析 简介 Spring MVC 4.1 中提供了 WebSocket 的支持,支持从服务器端主动向客户端推送数据。本篇文章将详细介绍 Spring MVC 4.1 实现服务器端推送的过程。 实现步骤 步骤一、添加依赖 首先,在 pom.xml 中添加 Spring WebSocket 的依赖: <depe…

    other 2023年6月27日
    00
  • 网页源代码保护(禁止右键、复制、另存为、查看源文件)

    首先,需要明确一点,网页源代码保护只是为了增加不必要的麻烦,技术上并不能完全阻止用户获取网页源代码。但增加这种保护可以起到一定的防范作用,对于一般的用户来说,即使他们实际上能够获取到网页源代码,但拦着他们能够达到的地步,就可以防止他们随意修改网页代码、盗用您的内容等等。 下面是一些常见的保护方式: 禁止右键 禁止右键可以通过以下代码实现: <scrip…

    other 2023年6月27日
    00
  • win10更新右键没有卸载怎么解决?

    Win10更新右键没有卸载怎么解决? 如果在Win10更新后,发现右键没有卸载选项,可以尝试以下方法解决: 方法一 按Win + R键打开运行窗口,输入regedit,打开注册表编辑器。 在注册表编辑器中,找到以下路径: HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers 找到名为“Comodo Antivirus…

    other 2023年6月27日
    00
  • Golang实现带优先级的select

    Golang实现带优先级的select攻略 在Golang中,select语句用于在多个通道上执行非阻塞的操作。然而,Golang的select语句默认是平等的,即在多个通道上等待时,每个通道有相同的机会被选择。但是,有时候我们希望某些通道具有更高的优先级,即在选择通道时它们有更大的几率被选中。下面是Golang实现带优先级的select的完整攻略。 步骤1…

    other 2023年6月28日
    00
  • ubuntu系统怎么查看版本? Linux查看系统版本信息的技巧

    当你使用Ubuntu系统时,你可以使用以下方法来查看系统的版本信息: 使用命令行工具:打开终端,然后输入以下命令: lsb_release -a 这个命令会显示系统的版本号、发行版名称和其他相关信息。例如,你可能会看到如下输出: No LSB modules are available. Distributor ID: Ubuntu Description:…

    other 2023年8月3日
    00
  • 入侵搜索关键字

    入侵搜索关键字攻略 入侵搜索关键字是指通过搜索引擎和其他工具来获取目标系统的敏感信息,以便进行未授权访问或其他恶意活动。下面是一个详细的攻略,包括两个示例说明。 步骤一:信息收集 在进行入侵搜索关键字之前,首先需要进行信息收集。这包括收集目标系统的域名、IP地址、子域名、邮箱地址等相关信息。以下是一些常用的信息收集工具和技术: Whois查询:使用Whois…

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