用于计算矩阵乘法的递归函数

时间:2016-01-04 00:08:04

标签: python recursion matrix

我试图写一个递归函数来计算矩阵乘法。

已编辑:

这是代码:

def mult_mat(x, nbr):
    result = [[2, 4],
              [1, 3]]

    if nbr == 1:
        return result
    else:
        for i in range(len(x)):
            for j in range(len(result[0])):
                for k in range(len(result)):
                    result[i][j] += x[i][k] * result[k][j]
        mult_mat(result, nbr-1)

    return result


m = [[2, 4],
      [1, 3]]

# the number of times m1 will be multiplied
n = 3
res = mult_mat(m, n)
for r in res:
    print(r)

例如,n = 3我试图得到结果:

m1 * m1将为[[8, 20], [5, 3]] = resultresult * m1将为[[36, 92], [23, 59]],依此类推。

此代码的输出为:

[10, 24]
[44, 108]

我想要的是这个:

[36, 92]
[23, 59]

1 个答案:

答案 0 :(得分:1)

好的,让我们从概念上理解你想要通过递归实现什么。您希望将矩阵M与其自身相乘。 mult_mat(M, 2)M * M,因此mult_mat(M, 1)只返回M

在乘法中,你有3个矩阵在继续。 xy是您将两个矩阵相乘的矩阵,存储在result中。现在,让我们来看看前几次乘法会发生什么。

x * x             # n = 2

x * (x * x)       # n = 3
                  # here, we initially calculate x * x,
                  # which we pass as y in the next stack for x * y

正如您所看到的,对于n = 2,您将自己乘以x,但对于n > 2yx不同,因此您必须以某种方式将它传递给函数。我们可以将这个想法编码如下。

def mult_mat(x, nbr, y=None):
    if nbr == 1:
        # if y is None, it means we called `mult_mat(x, 1)`, so return `x`
        if y is not None:
            return y
        return x

    if y is None:
        y = x
    result = [[0, 0],
              [0, 0]]
    for i in range(len(x)):
        for j in range(len(result[0])):
            for k in range(len(result)):
                result[i][j] += x[i][k] * y[k][j]
    return mult_mat(x, nbr-1, result)

m = [[2, 4],
      [1, 3]]

# the number of times m1 will be multiplied
n = 3
res = mult_mat(m, n)
for r in res:
    print(r)

它可能看起来像丑陋的代码,这可能是因为有更好的方法来实现你想要的没有递归。但是,在实现递归时,我想不出一种不同的方式。我的解决方案逻辑上来自我在开始时提出的要点。

相关问题