2016-01-04 92 views
-1

我想寫一個遞歸函數來計算矩陣乘法。計算矩陣乘法的遞歸函數

編輯:

這是代碼:

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] 
+0

你忘了告訴我們問題是什麼。 – timgeb

+0

快速瀏覽一下,你的函數返回'result',但是當你遞歸的時候,你會把它作爲'y'傳遞,這是沒有修改的。 – Reti43

+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) 

這可能看起來像醜陋的代碼,並且很可能是因爲有更好的方法來達到你想要的東西沒有遞歸。但是,在實現遞歸時,我想不出一種不同的方式。我的解決方案邏輯上從我在開始時列出的點開始流動。

+0

完美!有效 !謝謝 ! – Bilal