当前位置: 首页 > news >正文

C语言斐波那契数列的多样实现

在C语言中,斐波那契数列可以通过多种方法实现,包括递归、动态规划、矩阵快速幂等。以下是一些常见的实现方法:

1. 递归实现

递归是实现斐波那契数列最直接的方法,但效率较低,因为会重复计算许多子问题。

#include <stdio.h>

// 递归函数计算斐波那契数列的第n项
int fibonacci(int n) {
    if (n <= 1) {
        return n; // 基础情况:F(0) = 0, F(1) = 1
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2); // 递归情况
    }
}

int main() {
    int n;
    printf("Enter the term number: ");
    scanf("%d", &n);
    printf("The %dth term of the Fibonacci sequence is: %d\n", n, fibonacci(n));
    return 0;
}

2. 动态规划实现

动态规划方法通过存储已计算的斐波那契数来避免重复计算,从而提高效率。

#include <stdio.h>

// 动态规划函数计算斐波那契数列的第n项
int fibonacci(int n) {
    if (n <= 1) {
        return n; // 基础情况:F(0) = 0, F(1) = 1
    }
    int fib[n + 1]; // 创建一个数组来存储斐波那契数
    fib[0] = 0; // 初始化基础情况
    fib[1] = 1;
    for (int i = 2; i <= n; i++) {
        fib[i] = fib[i - 1] + fib[i - 2]; // 动态规划计算
    }
    return fib[n]; // 返回第n项
}

int main() {
    int n;
    printf("Enter the term number: ");
    scanf("%d", &n);
    printf("The %dth term of the Fibonacci sequence is: %d\n", n, fibonacci(n));
    return 0;
}

3. 矩阵快速幂实现

矩阵快速幂方法可以将计算斐波那契数列的时间复杂度降低到O(log n)。

#include <stdio.h>
#include <stdlib.h>

// 定义2x2矩阵
typedef struct {
    int a[2][2];
} Matrix;

// 矩阵乘法
Matrix multiply(Matrix m1, Matrix m2) {
    Matrix result;
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            result.a[i][j] = m1.a[i][0] * m2.a[0][j] + m1.a[i][1] * m2.a[1][j];
        }
    }
    return result;
}

// 矩阵快速幂
Matrix power(Matrix base, int n) {
    Matrix result = {{1, 0}, {0, 1}}; // 单位矩阵
    while (n > 0) {
        if (n % 2 == 1) {
            result = multiply(result, base);
        }
        base = multiply(base, base);
        n /= 2;
    }
    return result;
}

// 计算斐波那契数列的第n项
int fibonacci(int n) {
    Matrix base = {{1, 1}, {1, 0}};
    Matrix result = power(base, n);
    return result.a[0][1];
}

int main() {
    int n;
    printf("Enter the term number: ");
    scanf("%d", &n);
    printf("The %dth term of the Fibonacci sequence is: %d\n", n, fibonacci(n));
    return 0;
}

4. 通项公式实现

斐波那契数列的通项公式(Binet公式)可以直接计算第n项,但可能会出现精度问题。

#include <stdio.h>
#include <math.h>

// 通项公式计算斐波那契数列的第n项
int fibonacci(int n) {
    double phi = (1 + sqrt(5)) / 2; // 黄金分割比
    double psi = (1 - sqrt(5)) / 2; // 黄金分割比的共轭
    return (int)round((pow(phi, n) - pow(psi, n)) / sqrt(5));
}

int main() {
    int n;
    printf("Enter the term number: ");
    scanf("%d", &n);
    printf("The %dth term of the Fibonacci sequence is: %d\n", n, fibonacci(n));
    return 0;
}

以上是C语言中实现斐波那契数列的几种常见方法,每种方法都有其优缺点,适用于不同的场景。在实际应用中,可以根据需要选择合适的实现方法。

http://www.dtcms.com/a/130359.html

相关文章:

  • Day81 | 灵神 | 快慢指针 链表的中间结点 环形链表
  • 深入理解计算机操作系统(持续更新中...)
  • [dp9_子数组] 单词拆分 | 环绕字符串中唯一的子字符串
  • ​STM32H723 iPerf 调试笔记:MemManage_Handler 问题分析与解决
  • 入门到精通,C语言十大经典程序
  • 开发一款游戏需要哪些岗位角色参与?
  • CAN协议学习笔记1
  • 文章记单词 | 第29篇(六级)
  • linux下的目录文件管理和基本文件管理的基本操作
  • 5.3 GitHub订阅系统核心架构解密:高并发设计与SQLite优化实战
  • 「Unity3D」图片导入选项取消Read/Write,就无法正确显示导入大小,以及Addressable打包无法正确显示的问题
  • HarmonyOS应用开发指南
  • stm32+ADS1256称重模块,单通道称,多通道称(例如地磅)
  • MySQL一对多关系--多对多关系之间的区别
  • RCFile数据读取流程
  • 前缀和--
  • 消息中间件——RocketMQ(一)
  • 【复旦微FM33 MCU 底层开发指南】高级定时器ATIM
  • 齐次坐标系统:什么是齐次坐标?为什么要引入齐次坐标?
  • Go - 内存逃逸
  • C语言--实现图的基本操作
  • 探秘 LangChain 函数定义
  • Java 性能优化:从原理到实践的全面指南
  • #systemverilog# 关于基于systemveriog验证平台的RTL+TB文件编译顺序问题的讨论
  • c++11--std::forwaord--完美转发
  • zk源码-7.ZAB协议和数据存储二
  • arm_math.h、arm_const_structs.h 和 arm_common_tables.h
  • 游戏引擎学习第217天
  • Day14:关于MySQL的索引——创、查、删
  • 【腾讯云智】20250329笔试算法题