这是方法代码:
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错误。
感谢您的帮助。
答案 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
以启动矩阵的打印时,您希望printMatrix
和i
是什么?您可能希望使用相同的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);
}