2016-11-27 157 views
1

我試圖解決以下問題:生成的特殊矩陣「

給定一個數n,產生大小爲2的矩陣^ N * 2^n的尊重以下規則:

n = 1 
[ 1 2 ] 
[ 3 4 ] 

n = 2 
[ 1 2 5 6 ] 
[ 3 4 7 8 ] 
[ 9 10 13 14 ] 
[ 11 12 15 16 ] 

這裏是我的算法:

static void generare(int i , int j , int x , int y){ 
    if(x - i == 1 && y - j == 1) 
     { 
     mat[i][j] = counter++; 
     mat[i][j+1] = counter++; 
     mat[i+1][j] = counter++; 
     mat[i+1][j+1] = counter++; 
     } 
    else{ 
     generare(i,j,x/2,y/2); 
     generare(i,y/2+1,x/2,y); 
     generare(x/2+1,j,x,y/2); 
     generare(x/2+1,y/2+1,x,y); 
    } 
} 

它的工作原理對於n = 1,2,但是當我嘗試任何數量> 2,它崩潰。我怎樣才能修復我的遞歸函數?

+0

1.什麼是「墊子」? 2.它與什麼錯誤/異常崩潰? – UnholySheep

+0

mat是我矩陣的名字。我得到的錯誤是「java.lang.StackOverflowError」。我的遞歸函數在一個無限循環中結束,但我不知道應該添加什麼條件,所以我的函數仍然會按照我希望的方式執行。 – ivanciprian

+0

「mat」是如何定義的?同樣在這些計算中檢查相等性通常是一個壞主意,相反,您應該(可能)使用'<='。你的代碼也不包含一個'n'變量,那麼你怎麼調用它呢? (我假設你爲每個參數傳遞相同的數字?) – UnholySheep

回答

3

首先,我認爲你稱爲函數的方式不正確。對於我來說,你發佈的代碼甚至沒有工作了4X4 array.I認爲遞歸函數應該(0, 0, 2^n, 2^n)

不管怎麼說被調用,解決方法如下(我會解釋):

private static int[][] mat; 
private static int counter = 1; 

public static void generare(int i, int j, int x, int y) { 
    if (x - i <= 2 && y - j <= 2) { 

     mat[i][j] = counter++; 
     mat[i][j+1] = counter++; 
     mat[i+1][j] = counter++; 
     mat[i+1][j+1] = counter++; 
    } else { 
     generare(i, j, x/2+i/2, y/2+j/2); 
     generare(i, j+(y-j)/2, x/2 +i/2, y); 
     generare(i+(x-i)/2, j, x, y/2+j/2); 
     generare(i+(x-i)/2, j+(y-j)/2, x, y); 
    } 
} 

public static void main(String[] args) { 
    int power=3; 
    int n =(int) Math.pow(2, power); 
    mat = new int[n][n]; 
    generare(0, 0, n, n); 
    for(int i=0;i<n;i++) { 
     for(int j=0; j<n; j++){ 
      System.out.print(mat[i][j] +" "); 
     } 
     System.out.println(); 
    } 
} 

我解決它的方法是:當我們通過2陣列達到2

  1. 遞歸函數應該停止。
  2. 如果數組大於2乘2陣列。我們應該打4個電話(像你一樣),但有4個子陣列。這是你錯誤的地方,只是計算本身。

它爲你工作n = 1,2因爲遞歸調用只發生一次。一旦你的代碼運行不止一次,計算不正確。我所做的是繪製了一個8乘8的數組,並試圖僅使用i,j,x和y來表示調用。 希望這有助於:)

+0

謝謝你的exlanation,現在我明白了:) – ivanciprian

+0

如果你願意,我將不勝感激可以接受答案並進行投票。謝謝 – guymaor86