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

如何让递归函数保留原始参数值?矩阵行列式递归计算问题

递归计算行列式时原矩阵被修改的问题分析与修复

问题原因

你的代码里原矩阵被修改的核心问题是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:55:23