用Python实现斐波那契数列

目录

一、递归实现

代码

原理分析

二、带缓存的递归(记忆化)

代码

原理分析

三、动态规划

代码

原理分析

四、动态规划优化(滚动数组)

代码

原理分析

五、矩阵快速幂法

代码

原理分析


斐波那契数列(Fibonacci sequence)是一个经典的数学问题,数列中的每一项是前两项之和。它的递归定义如下:

  • F(0)=0
  • F(1)=1
  • F(n)=F(n−1)+F(n−2)(当 n>1)

接下来,逐步深度讲解它的实现方式及其背后的原理。


一、递归实现

代码
python 复制代码
def fibonacci_recursive(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)

# 示例
n = 10
print([fibonacci_recursive(i) for i in range(n)])
原理分析
  1. 递归调用

    • 函数 fibonacci_recursive 会递归计算 F(n−1) 和 F(n−2)
    • 每次递归都拆分成两个子问题,直到遇到基准情况F(0) 和 F(1)。
  2. 效率问题

    • 时间复杂度是 O(2^n),因为每个 F(n) 都重复计算了大量 F(k) 的值。
    • 空间复杂度是 O(n),因为递归深度最大为 n。

二、带缓存的递归(记忆化)

代码
python 复制代码
from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci_memoized(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci_memoized(n - 1) + fibonacci_memoized(n - 2)

# 示例
n = 10
print([fibonacci_memoized(i) for i in range(n)])
原理分析
  1. 缓存

    • lru_cache 会自动存储已计算的结果。
    • 每次递归调用时,先检查缓存,如果存在结果,就直接返回。
  2. 效率改进

    • 时间复杂度降为 O(n),因为每个 F(k) 只计算一次。
    • 空间复杂度仍然是 O(n),用于存储缓存。

三、动态规划

代码
python 复制代码
def fibonacci_dp(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    
    dp = [0, 1]
    for i in range(2, n + 1):
        dp.append(dp[-1] + dp[-2])
    return dp[-1]

# 示例
n = 10
print([fibonacci_dp(i) for i in range(n)])
原理分析
  1. 状态转移方程

    • F(n)=F(n−1)+F(n−2)
    • 通过一个数组 dp[] 存储中间结果,避免重复计算。
  2. 效率

    • 时间复杂度是 O(n),每个 F(k) 只计算一次。
    • 空间复杂度是 O(n)(存储数组大小)。

四、动态规划优化(滚动数组)

代码
python 复制代码
def fibonacci_optimized(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    
    prev, curr = 0, 1
    for _ in range(2, n + 1):
        prev, curr = curr, prev + curr
    return curr

# 示例
n = 10
print([fibonacci_optimized(i) for i in range(n)])
原理分析
  1. 空间优化

    • 只保留两个变量 prevcurr 表示前两项,消除数组存储。
  2. 效率

    • 时间复杂度仍为 O(n)。
    • 空间复杂度降为 O(1)。

五、矩阵快速幂法

代码
python 复制代码
import numpy as np

def fibonacci_matrix(n):
    if n == 0:
        return 0
    
    F = np.array([[1, 1], [1, 0]], dtype=object)
    result = np.linalg.matrix_power(F, n - 1)
    return result[0, 0]

# 示例
n = 10
print([fibonacci_matrix(i) for i in range(n)])
原理分析
  1. 数学公式

    • 斐波那契数列可以表示为矩阵幂:

时间复杂度是 O( log⁡ n),利用矩阵快速幂计算。

相关推荐
sheeta19981 小时前
LeetCode 每日一题笔记 日期:2026.05.13 题目:1674. 使数组互补的最少操作次数
笔记·算法·leetcode
liulilittle1 小时前
TCP UCP v1.0:BBR 的非破坏性约束层
网络·c++·网络协议·tcp/ip·算法·c·通信
z200509301 小时前
【linux学习】linux的基本指令
linux·学习
虹科数字化与AR1 小时前
移动质量检测设备选型:从成本、效率到用户体验
经验分享·移动检测技术选型
每天回答3个问题1 小时前
LeetCodeHot100|回溯算法、46.全排列、78.子集、17.电话号码的字母组合
算法·深度优先·回溯
AOwhisky2 小时前
Docker 学习笔记:镜像分发、容器运行与资源限制
笔记·学习·docker
LaughingZhu2 小时前
Product Hunt 每日热榜 | 2026-05-12
大数据·人工智能·经验分享·神经网络·产品运营
号码认证服务2 小时前
如何让经销商接电话时看到“XX集团”?申请号码认证统一上线
服务器·经验分享·sql·华为·智能手机·华为云·云计算
MediaTea2 小时前
人工智能通识课:机器学习之无监督学习
人工智能·深度学习·学习·机器学习
Liangwei Lin2 小时前
LeetCode 287. 寻找重复数
算法·leetcode·职场和发展