如何让递归函数保留原始参数值?矩阵行列式递归计算问题
递归计算行列式时原矩阵被修改的问题分析与修复
问题原因
你的代码里原矩阵被修改的核心问题是Python中列表是可变对象,赋值操作传递的是引用而非副本。在scale_down函数里,var = matrix只是让var指向了原矩阵的内存地址,后续对var执行的pop操作,本质上是直接修改了原矩阵的内容。这导致第一次循环后,外层la_place的matrix已经被改变,后续循环自然无法拿到原始数据。
修复方案
要解决这个问题,关键是在scale_down里创建原矩阵的深拷贝,确保操作的是独立的副本,不影响原矩阵。可以用列表推导式实现深拷贝,或者使用copy模块的deepcopy方法。
修改后的代码:
def la_place(matrix): if len(matrix) == 2: return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0] g = -1 det = 0 for i in range(len(matrix)): g *= -1 var = scale_down(matrix, i) det += g * matrix[0][i] * la_place(var) return det def scale_down(matrix, i): # 创建原矩阵的深拷贝,避免修改原数据 var = [row.copy() for row in matrix] if len(var) > 2: var.pop(0) for x in range(len(var)): var[x].pop(i) return var a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(la_place(a)) # 输出0,符合3阶奇异矩阵的行列式结果
说明
[row.copy() for row in matrix]会逐行复制原矩阵的每一行,生成一个全新的矩阵对象,和原矩阵完全独立。- 这样每次调用
scale_down时,操作的都是副本,外层的原矩阵始终保持初始状态,递归过程中的每一步都能拿到正确的子矩阵。
内容的提问来源于stack exchange,提问作者raziuuu
相关产品推荐
相关产品推荐

