4x4矩阵行列式递归计算代码报索引越界错误及矩阵损坏问题咨询
4x4矩阵行列式递归计算代码报索引越界错误及矩阵损坏问题咨询
我来帮你拆解这个问题,你遇到的两个问题——索引越界和矩阵损坏,其实是同一个原因导致的:你的代码直接在原始矩阵上进行了删除操作,破坏了矩阵的结构,既引发了递归过程中的索引错误,也让原矩阵彻底被修改得面目全非。
问题根源分析
索引越界的原因
你的循环是基于初始4x4矩阵的长度(循环4次,i从0到3),但第一次循环里,你执行del matrix[0]删掉了矩阵的第一行,又对剩下的每行执行del row[i]删掉第i列元素。此时矩阵已经从4x4变成了3x3。当循环走到i=3的时候,剩下的行只有3个元素(索引范围0-2),你再去访问row[3]自然就触发了IndexError。矩阵损坏的含义
因为你直接修改了传入的原始矩阵,而非创建副本。递归结束后,原本的4x4矩阵会被删得只剩残缺的结构——甚至可能变成空矩阵。这意味着如果你在调用determinant_4x4之后还想使用原来的矩阵,它已经不是你最初传入的那个矩阵了,这就是GPT所说的“矩阵被损坏”。
修复后的代码
正确的做法是创建子矩阵的独立副本,完全不修改原始矩阵,这样既不会出现索引错误,也能保留原矩阵的完整性:
def determinant_4x4(matrix: list[list[int|float]]) -> float: def recursedet(matrix): n = len(matrix) if n == 2: return matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0] det_sum = 0 for i in range(n): # 取出当前要计算的元素 ele = matrix[0][i] # 生成子矩阵:跳过第一行,每行跳过第i列,全程用副本不碰原矩阵 sub_matrix = [row[:i] + row[i+1:] for row in matrix[1:]] # 递归累加行列式值 det_sum += ele * ((-1)**i) * recursedet(sub_matrix) return det_sum # 提前创建原矩阵的副本,彻底避免原矩阵被修改 matrix_copy = [row.copy() for row in matrix] return recursedet(matrix_copy)
修复要点说明
- 用
row[:i] + row[i+1:]生成每行去掉第i列的新列表,搭配matrix[1:]跳过第一行,生成的sub_matrix是完全独立的副本,不会影响原始矩阵。 - 把变量名
sum改成了det_sum,避免占用Python内置函数名。 - 提前创建原矩阵的副本,确保即使递归过程中有意外操作,原矩阵也能保持初始状态。
备注:内容来源于stack exchange,提问作者Shreyas Mishra
相关产品推荐
相关产品推荐

