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

如果您尝试将矩阵的每个元素打印一次,那么其他答案中的任何解决方案[编辑:我想我们现在只有一个答案] 都没有帮助。他们要做的最多的是摆脱堆栈溢出错误,但输出仍然不会接近您的需要。

假设这是一个家庭作业,并且由于某种原因你被告知使用递归(在现实生活中没有人会这样做),你必须退后一步想想这个:你想做printMatrix(m,i,j)什么?大概,你想打印m[i][j]元素,然后调用printMatrix打印矩阵的其余部分。当您printMatrix递归调用以开始打印矩阵的其余部分时,您想要什么ij成为什么?可能,您想要相同i的下一列,j+1,但不是 ifj位于行尾。那你想……我让你考虑一下。但我不认为你想printMatrix调用自己两次。相反,您希望它只调用一次(最多);你可能需要一个if看起来像的声明

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

但它仍然只会调用自己一次(因为它会选择一个或另一个)。

我将提到另一件事:您正在与i数组中的行数 ( m.length) 进行比较,但您也在与j数组中的行数进行比较。如果你知道这是一个方阵,那很好。但是,如果要与j列数进行比较,请将其与 进行比较m[i].length,因为m[i]它本身就是一个数组(代表矩阵的一行)。

于 2013-10-10T21:34:17.573 回答
0

数组 'm' 的大小将在递归调用中保持不变。而 i 和 j 的值会发生变化,而基本条件只会满足一次。所以它无限进入的基本条件是相同的 i 和 j。这就是为什么我猜它只打印一个值并且在某个时间后堆栈溢出。我并不认为这是对递归的正确使用。如我错了请纠正我。当使用递归时,问题会随着函数调用而减小大小,直到它被分解成可能的最小单元,这可以通过基本条件或断点来识别。我看不到这种情况发生在这里。

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);
    }

}
} 

这适用于一维数组,你可以试试这个二维数组,看看它是否有效。我希望它有帮助!

于 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 回答