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

使用DeepSeek,优化斐波那契数函数,效果相当不错

下面这段代码定义了一个递归函数 fibonacci,用于计算第 n 个斐波那契数。

def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

虽然代码逻辑正确,但其性能较差,尤其是对于较大的 n 值,其复杂度较高:

  • 时间复杂度:当前代码的时间复杂度为 O(2^n),因为每次调用 fibonacci(n) 会递归调用 fibonacci(n-1)fibonacci(n-2),导致重复计算。
  • 空间复杂度:空间复杂度为 O(n),因为递归调用栈的深度为 n
优化 1:使用动态规划(自顶向下,带备忘录)

通过缓存已经计算过的斐波那契数,避免重复计算,可以将时间复杂度优化到 O(n)

def fibonacci(n, memo={}):
    if n <= 1:
        return n
    if n not in memo:
        memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo)
    return memo[n]
优化 2:使用动态规划(自底向上,迭代法)

通过迭代的方式计算斐波那契数,避免递归调用栈的开销,同时将空间复杂度优化到 O(1)

def fibonacci(n):
    if n <= 1:
        return n
    a, b = 0, 1
    for _ in range(2, n + 1):
        a, b = b, a + b
    return b
优化 3:使用 Python 内置的 lru_cache 装饰器

Python 的 functools 模块提供了 lru_cache 装饰器,可以自动缓存函数的结果,避免重复计算。

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)
优化4:使用矩阵快速幂算法(高级优化)

对于非常大的 n 值,可以使用矩阵快速幂算法将时间复杂度优化到 O(log n)。这种方法适合对性能要求极高的场景。

def matrix_mult(a, b):
    return [
        [a[0][0] * b[0][0] + a[0][1] * b[1][0], a[0][0] * b[0][1] + a[0][1] * b[1][1]],
        [a[1][0] * b[0][0] + a[1][1] * b[1][0], a[1][0] * b[0][1] + a[1][1] * b[1][1]],
    ]

def matrix_pow(matrix, power):
    result = [[1, 0], [0, 1]]  # Identity matrix
    while power > 0:
        if power % 2 == 1:
            result = matrix_mult(result, matrix)
        matrix = matrix_mult(matrix, matrix)
        power //= 2
    return result

def fibonacci(n):
    if n <= 1:
        return n
    matrix = [[1, 1], [1, 0]]
    result = matrix_pow(matrix, n - 1)
    return result[0][0]

推荐使用 优化建议 2(迭代法),因为它在时间复杂度和空间复杂度上都有较好的平衡,且代码简洁易读。优化后的代码如下:

def fibonacci(n):
    if n <= 1:
        return n
    a, b = 0, 1
    for _ in range(2, n + 1):
        a, b = b, a + b
    return b

相关文章:

  • 什么是有限元力学?分而治之,将复杂问题转化为可计算的数学模型
  • 设计模式-适配器模式
  • 【网页】自制流光卡片
  • 【面试手撕】非常规算法,多线程常见手撕题目
  • 【开源免费】基于SpringBoot+Vue.JS智慧生活商城系统(JAVA毕业设计)
  • vue/H5的日历组件可简单定制
  • 【spring boot 实现图片验证码 前后端】
  • STM32微控制器_03_GPIO原理与应用
  • 力扣No.376.摆动序列
  • LightGBM + TA-Lib A股实战进阶:Optuna调优与Plotly可视化详解
  • 【pptx-preview】react+pptx预览
  • 蓝牙系统的核心组成解析
  • 拥抱健康养生,开启活力生活
  • {瞎掰} 手机安装app问题:app签名,手机 or OS官方商店 其他非官方app源,安全防护 突破限制
  • gitee 远程修改完密码本地提交出错的解决方案
  • 网络性能指标
  • TK矩阵系统的软件服务
  • tuh_eeg数据集
  • 文档搜索引擎项目测试
  • 国密系列加密技术及其在爬虫逆向中的应用研究
  • 十大券商看后市|A股中枢有望逐步震荡抬升,把握结构性行情
  • 上海“电子支付费率成本为0”背后:金融服务不仅“快”和“省”,更有“稳”和“准”
  • 2025年上海市模范集体、劳动模范和先进工作者名单揭晓
  • 中方是否认同俄方关于新纳粹主义观点?外交部:联大曾多次通过相关决议
  • 越怕出错越会出错,“墨菲定律”的魔咒该怎么破?
  • 中俄元首今年首次面对面会谈,达成哪些新的重要共识?