Alogrithm:费式数列

1. 说明

Fibonacci 为1200年代的欧洲数学家,在他的著作中曾经提到:「若有一只免子每个月生一只小免子,一个月后小免子也开始生产。起初只有一只免子,一个月后就有两只免子,二个月后有三只免子,三个月后有五只免子(小免子投入生产)......。如果不太理解这个例子的话,举个图就知道了,注意新生的小免子需一个月成长期才会投入生产,类似的道理也可以用于植物的生长,这就是 Fibonacci 数列,一般习惯称之为费氏数列,例如以下:1、1、2、3、5、8、13、21、34、55、89......

2. 解法


依上图所示,我们可以将费氏数列定义为以下:

Fib[0] = 1;
Fib[1] = 1;
Fib[2] = Fib[1] + Fib[0];
Fib[3] = Fib[2] + Fib[1];
...
基于如上的推论,当 N<=1 时,Fib[N] = 1,当N >= 2 时,Fib[N] = Fib[N-1] + Fib[N-2]。

2.1 C 语言实现

在 C 语言中,常用的 Fibonacci 数列计算方法有几种,最基本的是递归法、动态规划法(或迭代法)。为了提高性能,通常采用迭代法。

2.1.1 递归方法

复制代码
#include <stdio.h>

// 递归函数计算第 n 项 Fibonacci 数
int fibonacci(int n) {
    if (n <= 1) {
        return 1;  // F(0) = 1 和 F(1) = 1
    }
    return fibonacci(n - 1) + fibonacci(n - 2);  // F(n) = F(n-1) + F(n-2)
}

int main() {
    int n;
    printf("Enter the number of months: ");
    scanf("%d", &n);

    printf("The number of rabbits in month %d is %d\n", n, fibonacci(n));
    return 0;
}

2.1.2 迭代方法(优化)

迭代方法是更高效的 Fibonacci 数列计算方式,它避免了递归的重复计算。

复制代码
#include <stdio.h>

// 迭代法计算第 n 项 Fibonacci 数列
int fibonacci(int n) {
    if (n <= 1) {
        return 1;  // F(0) = 1 和 F(1) = 1
    }

    int a = 1, b = 1, temp;
    for (int i = 2; i <= n; i++) {
        temp = a + b;  // 当前项是前两项之和
        a = b;  // 更新 a 为 b
        b = temp;  // 更新 b 为新计算的值
    }
    return b;  // 返回第 n 项
}

int main() {
    int n;
    printf("Enter the number of months: ");
    scanf("%d", &n);

    printf("The number of rabbits in month %d is %d\n", n, fibonacci(n));
    return 0;
}

2.2 递归和迭代方法对比

  • 递归方法:
    • 时间复杂度:O(2^n),由于有重复的计算,效率较低。
    • 空间复杂度:O(n),递归调用栈需要存储函数调用。
  • 迭代方法:
    • 时间复杂度:O(n),每个 Fibonacci 数只需要计算一次。
    • 空间复杂度:O(1),只需要常量空间来保存前两个数。
相关推荐
头发掉光的程序员9 小时前
第九章 纹理贴图
c++·图形渲染·direct12
一念&13 小时前
每日一个C语言知识:C 数据类型
c语言·开发语言
进击中的小龙13 小时前
在vscode下的cmake项目里传参调试c++命令行程序
c++·vscode
迈火14 小时前
PuLID_ComfyUI:ComfyUI中的图像生成强化插件
开发语言·人工智能·python·深度学习·计算机视觉·stable diffusion·语音识别
wzg201614 小时前
vscode 配置使用pyqt5
开发语言·数据库·qt
奔跑吧邓邓子15 小时前
【C++实战(74)】深入C++安全编程:密码学实战之旅
c++·安全·实战·密码学·安全编程
板鸭〈小号〉15 小时前
Socket网络编程(1)——Echo Server
开发语言·网络·php
明天会有多晴朗15 小时前
C语言入门教程(第1讲):最通俗的C语言常见概念详解与实战讲解
c语言·开发语言·c++
爱上妖精的尾巴15 小时前
5-20 WPS JS宏 every与some数组的[与或]迭代(数组的逻辑判断)
开发语言·前端·javascript·wps·js宏·jsa
Larry_Yanan16 小时前
QML学习笔记(二十四)QML的Keys附加属性
c++·笔记·qt·学习·ui