2016-11-27 33 views
1

を生成は、私は次のような問題を解決しようとしています「特別な行列」

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つのサブ配列を使って関数を呼び出す必要があります。あなたはそれが間違っている場所です。計算自体です。

再帰呼び出しが1回しか起こらなかったので、n = 1,2のために働いていました。コードが複数回実行されると、計算が正しく行われませんでした。私がしたことは、8行8列の配列を描き、i、j、x、yだけを使って呼び出しを表現しようとしました。 希望するもの:

+0

exlanationありがとう、今私はそれを得る: – ivanciprian

+0

私はあなたが答えを受け入れて投票することができます。ありがとう – guymaor86

関連する問題