首页 > 解决方案 > 如何在类函数中使用递归

问题描述

我做了一个处理矩阵或列表中的列表的类函数。有点像一个看起来像这样的计算器:

class RealMat:
    def __init__(self, mat):
        self.mat = mat

    def __add__(self, other):
        if len(self.mat) != len(other.mat) or len(self.mat[0]) != len(self.mat[0]):
            return None
        result = self.mat
        for i in range(len(self.mat)):
            for j in range(len(self.mat[0])):
                result[i][j] = self.mat[i][j] + other.mat[i][j]
        return RealMat(result)


    def __sub__(self, other):
        if len(self.mat) != len(other.mat) or len(self.mat[0]) != len(self.mat[0]):
            return None
        result = self.mat
        for i in range(len(self.mat)):
            for j in range(len(self.mat[0])):
                result[i][j] = self.mat[i][j] - other.mat[i][j]
        return RealMat(result)

    def __mul__(self, other):
        if isinstance(other, int):
            for x in range(len(self.mat)):
                for y in range(len(self.mat[0])):
                    self.mat[x][y] = self.mat[x][y] * other
            return RealMat(self.mat)
        if len(self.mat[0])!=len(other.mat):
            return None
        column=0
        result=[[0]*len(self.mat) for i in range(len(other.mat[0]))]
        for x in range(len(other.mat[0])):
            row = 0
            for x in range(len(self.mat)):
                total = 0
                i = 0
                for x in range(len(self.mat[0])):
                    total += self.mat[row][i] * other.mat[i][column]
                    i += 1
                result[row][column] = total
                row += 1
            column += 1
        return RealMat(result)

    def __rmul__(self, factor):
        for x in range(len(self.mat)):
                for y in range(len(self.mat[0])):
                    self.mat[x][y] = self.mat[x][y] * factor
        return RealMat(self.mat)

    def __pow__(self, n):
        if len(self.mat) != len(self.mat[0]):
            return None
        if n == 0:
             identity = [[1 if i == j else 0 for i in range(len(self.mat))] for j in range(len(self.mat))]
            return RealMat(identity)
        result = RealMat(self.mat)
        for x in range(n-1):
            result = result * RealMat(self.mat)
        return result

    def __eq__(self, other):
        if len(self.mat) != len(other.mat) or len(self.mat[0]) != len(other.mat[0]):
            return False
        for x in range(len(self.mat)):
            for y in range(len(self.mat[0])):
                if self.mat[x][y] != other.mat[x][y]:
                    return False
        return True


    def getMatrixMinor(self,i,j):
        return [row[:j] + row[j+1:] for row in (self.mat[:i]+self.mat[i+1:])]

    def getMatrixDeternminant(self):
        if len(self.mat) == 2:
            return self.mat[0][0]*self.mat[1][1]-self.mat[0][1]*self.mat[1][0]

        determinant = 0
        for c in range(len(self.mat)):
            determinant += ((-1)**c)*self.mat[0][c]*getMatrixDeternminant(getMatrixMinor(self.mat,0,c))
        return determinant

所有其他代码工作正常,我很满意,但我似乎无法让我的行列式查找器代码工作

def getMatrixMinor(self,i,j):
    return [row[:j] + row[j+1:] for row in (self.mat[:i]+self.mat[i+1:])]

这段代码让我得到了次要矩阵,而这个:

def getMatrixDeternminant(self):
    if len(self.mat) == 2:
        return self.mat[0][0]*self.mat[1][1]-self.mat[0][1]*self.mat[1][0]

    determinant = 0
    for c in range(len(self.mat)):
        determinant += ((-1)**c)*self.mat[0][c]*getMatrixDeternminant(getMatrixMinor(self.mat,0,c))
    return determinant

求解 nxn 矩阵的行列式。但是,当我尝试递归它时,它一直说“getMatrixDeternminant 未定义”。也许是因为它在课堂上?我刚刚进入 OOP,所以我并不精通这一点。有人可以指出我做错了什么吗?

编辑*我尝试使用 self.getMatrixDeternminant()

def getMatrixMinor(self,m,i,j):
    return [row[:j] + row[j+1:] for row in (m[:i]+m[i+1:])]

def getMatrixDeternminant(self):
    if len(self.mat) == 2:
        return self.mat[0][0]*self.mat[1][1]-self.mat[0][1]*self.mat[1][0]

    determinant = 0
    for c in range(len(self.mat)):
        determinant += ((-1)**c)*self.mat[0][c]*self.getMatrixDeternminant(self.getMatrixMinor(self.mat,0,c))
    return determinant

它说:

TypeError: getMatrixDeternminant() takes 1 positional argument but 2 were given

编辑**:我实际上是从某个地方得到代码并试图在我的班级中实现它。这是原始代码:

def getMatrixMinor(m,i,j):
    return [row[:j] + row[j+1:] for row in (m[:i]+m[i+1:])]

def getMatrixDeternminant(m):
    #base case for 2x2 matrix
    if len(m) == 2:
        return m[0][0]*m[1][1]-m[0][1]*m[1][0]

    determinant = 0
    for c in range(len(m)):
        determinant += ((-1)**c)*m[0][c]*getMatrixDeternminant(getMatrixMinor(m,0,c))
    return determinant

标签: pythonpython-3.x

解决方案


您的getMatrixDeternminant[原文] 计算当前对象 ( self) 的行列式。但是,您的算法需要计算其他矩阵的行列式。

因此,首先要保持算法原来的样子(通常你会将其设为静态方法或将其保留在类之外)。然后,从您的方法中,调用该算法并将其传递给您当前的矩阵。


推荐阅读