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

4x4矩阵行列式递归计算代码报索引越界错误及矩阵损坏问题咨询

4x4矩阵行列式递归计算代码报索引越界错误及矩阵损坏问题咨询

我来帮你拆解这个问题,你遇到的两个问题——索引越界和矩阵损坏,其实是同一个原因导致的:你的代码直接在原始矩阵上进行了删除操作,破坏了矩阵的结构,既引发了递归过程中的索引错误,也让原矩阵彻底被修改得面目全非。

问题根源分析

  1. 索引越界的原因
    你的循环是基于初始4x4矩阵的长度(循环4次,i从0到3),但第一次循环里,你执行del matrix[0]删掉了矩阵的第一行,又对剩下的每行执行del row[i]删掉第i列元素。此时矩阵已经从4x4变成了3x3。当循环走到i=3的时候,剩下的行只有3个元素(索引范围0-2),你再去访问row[3]自然就触发了IndexError。

  2. 矩阵损坏的含义
    因为你直接修改了传入的原始矩阵,而非创建副本。递归结束后,原本的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 20:03:00