打印数组的递归方法

时间:2013-10-10 21:14:13

标签: java recursion printing

这是方法代码:

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 个答案:

答案 0 :(得分: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] + "]");
}

答案 1 :(得分:1)

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

假设这是一个家庭作业并且你被告知因某种原因使用递归(在现实生活中没有人会这样做),你必须退后一步思考:你想要什么{{1} } 去做?据推测,您希望打印printMatrix(m,i,j)元素,然后调用m[i][j]来打印矩阵的其余部分。当您递归调用printMatrix以启动矩阵的打印时,您希望printMatrixi是什么?您可能希望使用相同的j和下一列i,但如果j+1位于行的末尾,则不需要j。那你想......我会让你考虑一下。但我认为你不希望printMatrix自称两次。相反,你希望它只调用一次(最多);你可能需要一个类似

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

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

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

答案 2 :(得分: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);
    }

}
} 

这适用于一维数组,您可以尝试使用2D数组并查看它是否有效。 我希望它有所帮助!

答案 3 :(得分: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);       
    }