You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归计算矩阵行列式时参数副本修改引发原矩阵元素丢失问题

矩阵行列式递归函数的引用问题与优化

问题根源

你原来的代码里,m=matrix.copy()做的是浅拷贝——对于二维列表来说,外层列表被复制,但里面的每个子列表还是和原列表共享内存引用。所以minor函数里的del x[i]操作的是子列表,这会直接修改原matrix里的对应子列表内容,导致后续递归计算出错。

简洁解决方案

不需要用繁琐的嵌套循环手动构建子矩阵,也不需要依赖深拷贝,直接通过列表推导式生成minor矩阵,全程不修改原数据:

def determinant(matrix):
    def minor(mat, i):
        # 直接生成第0行被移除、第i列被移除的新矩阵
        return [row[:i] + row[i+1:] for row in mat[1:]]
    
    if len(matrix) == 1:
        return matrix[0][0]
    if len(matrix) == 2:
        return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
    det = 0
    for i in range(len(matrix)):
        det += ((-1)**i) * matrix[0][i] * determinant(minor(matrix, i))
    return det

# 测试
m5 = [[2,4,2],[3,1,1],[1,2,0]]
print(determinant(m5))  # 输出:-12

方案说明

  • minor函数通过列表推导式,对原矩阵的第1行及以后的每一行,截取除第i列外的元素组成新行,直接生成独立的子矩阵,完全不修改原矩阵的任何内容。
  • 递归过程中不需要拷贝原矩阵,避免了浅拷贝带来的引用问题,代码更简洁高效。

内容的提问来源于stack exchange,提问作者dmitry berestnev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:40:27