用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),利用矩阵快速幂计算。

相关推荐
Orange--Lin18 分钟前
【用deepseek和chatgpt做算法竞赛】——还得DeepSeek来 -Minimum Cost Trees_5
人工智能·算法·chatgpt
01_26 分钟前
力扣hot100 ——搜索二维矩阵 || m+n复杂度优化解法
算法·leetcode·矩阵
SylviaW0828 分钟前
python-leetcode 35.二叉树的中序遍历
算法·leetcode·职场和发展
篮l球场29 分钟前
LeetCodehot 力扣热题100
算法·leetcode·职场和发展
pzx_00141 分钟前
【机器学习】K折交叉验证(K-Fold Cross-Validation)
人工智能·深度学习·算法·机器学习
BanLul42 分钟前
进程与线程 (三)——线程间通信
c语言·开发语言·算法
qy发大财1 小时前
分发糖果(力扣135)
数据结构·算法·leetcode
陈无左耳、1 小时前
HarmonyOS学习第4天: DevEco Studio初体验
学习·华为·harmonyos
微刻时光1 小时前
影刀RPA中级证书-Excel进阶-开票清单
经验分享·python·低代码·rpa·影刀·影刀证书·影刀实战
挣扎与觉醒中的技术人2 小时前
网络安全入门持续学习与进阶路径(一)
网络·c++·学习·程序人生·安全·web安全