1

これはメソッドコードです:

public static void printMatrix(int[][] m, int i, int j) {
    if (i == m.length ||j==m.length) {
        System.out.println();
    } else {
        System.out.print("[" + m[i][j] + "]");

        printMatrix(m, i, j++);
        printMatrix(m, i++, j);
    }

}

StackOverFlow エラーが発生するまで配列の最初の位置を出力する理由がわかりません。

助けてくれてありがとう。

4

4 に答える 4

2

再帰関数を 2 回呼び出しますが、i と j で自分自身を呼び出し続けます。

printMatrix(m, i, j++);  << use ++j
printMatrix(m, i++, j); << use ++i

ここにあなたのための可能な解決策があります

public static void printMatrix(int[][] m, int i, int j)
{
    System.out.print("[" + m[i][j] + "]");
    if (i == m.length && j == m.length)
    {
        return;
    }

    if (j == m.length)
    {
        j = 0;
        ++i;
        printMatrix(m, i, j);
    }
    else 
    {
        j++;
        printMatrix(m, i, j);
    }
}

非再帰的

public static void printMatrix(int[][] m)
{
    for (int i = 0; i < m.length; i++)
        for (int j = 0; j < m.length; j++)
            System.out.print("[" + m[i][j] + "]");
}
于 2013-10-10T21:16:08.333 に答える
1

マトリックスの各要素を一度印刷しようとしている場合、他の回答の解決策はどれも役に立ちません[編集:現在、回答は1つに減っていると思います]。彼らができることは、スタックオーバーフローエラーを取り除くことだけですが、それでも出力は必要なものに近くなりません。

これが宿題で、何らかの理由で再帰を使用するように言われたと仮定すると (実際には誰もそんなことはしないでしょう)、一歩下がって次のことを考えなければなりません: いったい何をしたいprintMatrix(m,i,j)のか? m[i][j]おそらく、要素を出力してから、 を呼び出しprintMatrixて残りのマトリックスを出力したいとします。マトリックスの残りの印刷を開始するために再帰的に呼び出す場合printMatrix、何をしたいiですjか? おそらく、同じi列と次の列が必要ですが、 が行の最後にあるj+1場合は必要ありません。jそれからあなたが望む...私はあなたにそれについて考えさせます。printMatrixしかし、私はあなたが二度自分自身を呼び出したいとは思わない. 代わりに、(多くても) 1 回だけ自分自身を呼び出す必要があります。おそらく必要になるでしょうif次のように見えるステートメント

if(something) 
   printMatrix(something); 
else 
   printMatrix(something different);

ただし、自分自身を呼び出すのは 1 回だけです (どちらかを選択するため)。

もう 1 つ言及します。i配列内の行数 ( m.length) と比較していますが、配列内の行数とも比較jしています。これが正方行列であることがわかっていれば問題ありません。jしかし、列の数と比較したい場合は、 と比較します。これはm[i].lengthm[i]自体が配列 (行列の 1 行を表す) であるためです。

于 2013-10-10T21:34:17.573 に答える
0

配列 'm' のサイズは、再帰呼び出しを通じて一定になります。一方、i と j の値は変化し、基本条件は一度だけ満たされます。つまり無限に入る基本条件は同じ i と j でした。そのため、1つの値のみを出力し続け、しばらくするとスタックがオーバーフローすると思います。私はこれを再帰の適切な使用法とは考えていません。私が間違っている場合は修正してください。再帰を使用すると、関数呼び出しが可能な限り最小の単位に分割されるまで、問題のサイズが縮小されます。これは、基本条件またはブレークポイントによって識別できます。私はこれがここで起こっているのを見ません。

public class Printarray {
 static int max= 2;
/**
 * @param args the command line arguments
 */

public static void main(String[] args) {
    // TODO code application logic here
     int array[]={1,2,3};
    print(array,0);




}
public static void print(int array[],int i)
{
     System.out.println(array[i]);
    if(i==Printarray.max)
    {
          Printarray.max--;
        return;
    }
    else
    {
        print(array,i+1);
    }

}
} 

これは 1D 配列で機能します。これを 2D 配列で試して、機能するかどうかを確認できます。それが役立つことを願っています!

于 2015-04-10T16:11:30.997 に答える
0
private static void print(int[][] mat, int i, int j) {
    // TODO Auto-generated method stub
    if(mat==null){
        return;
    }
    if(i==mat.length || j==mat[0].length){
        return;
    }       
    System.out.print(mat[i][j]+" ");
        if(j==mat[0].length-1){
                System.out.println();
            print(mat,i+1,0);
        }       
        print(mat,i,j+1);       
    }
于 2016-03-11T22:20:30.900 に答える