递归计算矩阵行列式时参数副本修改引发原矩阵元素丢失问题
矩阵行列式递归函数的引用问题与优化
问题根源
你原来的代码里,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
相关产品推荐
相关产品推荐

