2014-01-28 31 views
0

所以基本上,我想要做的是製作一個方法,以2個矩陣作爲參數,並將它們相乘。這是一項學校任務,我要求通過遞歸「分而治之」來解決這個問題。這是我的代碼到目前爲止:用於遞歸矩陣乘法的Java方法?

public class RecMult { 

    public int[][] calc(int[][] a, int[][] b) { 

     int n = a.length; 
     int[][] c = new int[n][n]; 

     if (n == 1) { 
      c[0][0] = a[0][0] * b[0][0]; 
     } else { 
      int sub = a.length/2; 
      int[][] smalla11 = new int[sub][sub]; 
      int[][] smalla12 = new int[sub][sub]; 
      int[][] smalla21 = new int[sub][sub]; 
      int[][] smalla22 = new int[sub][sub]; 
      int[][] smallb11 = new int[sub][sub]; 
      int[][] smallb12 = new int[sub][sub]; 
      int[][] smallb21 = new int[sub][sub]; 
      int[][] smallb22 = new int[sub][sub]; 

      for (int i = 0; i < sub; i++) { 
       for (int j = 0; j < sub; j++) { 
        smalla11[i][j] = a[i][j]; 
        smalla12[sub + i][j] = a[sub + i][j]; 
        smalla21[i][sub + j] = a[i][sub + j]; 
        smalla22[sub + i][sub + j] = a[sub + i][sub + j]; 
        smallb11[i][j] = b[i][j]; 
        smallb12[sub + i][j] = b[sub + i][j]; 
        smallb21[i][sub + j] = b[i][sub + j]; 
        smallb22[sub + i][sub + j] = b[sub + i][sub + j]; 
       } 
      } 
      c[0][0] = calc(smalla11, smallb11); 
     } 
     return c; 
    } 
} 

我沒有完成代碼,因爲我遇到了一個問題很快。我無法將c[0][0]設置爲calc(smalla11, smallb11),因爲它需要一個int,並且calc方法返回一個int [] []。我不確定此時該做什麼。有時候,我只想返回一個int,但後來我想返回子矩陣,最後返回整個矩陣。有沒有人有任何建議,無論是關於如何「修復」這個回報問題,或者甚至更好的想法如何編寫這樣的程序的代碼?

回答

0

您試圖將二維數組(calc(smalla11,smallb11)的結果)存儲到單個元素c [0,0]中。 c已被聲明爲2維數組。你有意試圖將結果存儲在單個點0,0嗎?

這會做你所需要的嗎?

c = calc(smalla11, smallb11); 

這讓我的大腦受到傷害,但它很有趣! :)

+0

我意識到這一點,我也試圖這麼說:p事情是,並且據我所知,這個代碼(我得到了一個僞代碼)與它自己一起工作,直到它只有1個int來相乘和另外一個。在這一點上,代碼只是返回一個int。但它的遞歸,從現在開始,它應該返回一個c int [sub] [sub]直到它最後返回c [n] [n],其中n是數組維度的最大長度。這些數組是n x n btw。我有點困惑於如何將所有這一切都變成一種工作遞歸方法,但據我所知,我必須使用另一種方法,除非我以另一種方式聲明int。 – mathkid91