我试图写一个递归函数来计算矩阵乘法。
已编辑:
这是代码:
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]] = result
,result * m1
将为[[36, 92], [23, 59]]
,依此类推。
此代码的输出为:
[10, 24]
[44, 108]
我想要的是这个:
[36, 92]
[23, 59]
答案 0 :(得分:1)
好的,让我们从概念上理解你想要通过递归实现什么。您希望将矩阵M
与其自身相乘。 mult_mat(M, 2)
会M * M
,因此mult_mat(M, 1)
只返回M
。
在乘法中,你有3个矩阵在继续。 x
和y
是您将两个矩阵相乘的矩阵,存储在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 > 2
,y
与x
不同,因此您必须以某种方式将它传递给函数。我们可以将这个想法编码如下。
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)
它可能看起来像丑陋的代码,这可能是因为有更好的方法来实现你想要的没有递归。但是,在实现递归时,我想不出一种不同的方式。我的解决方案逻辑上来自我在开始时提出的要点。