2013-10-10 77 views
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的錯誤第一的位置。

感謝您的幫助。

+1

嘗試使用調試器。瀏覽代碼,看看你的停止事件是否發生。 –

+0

如果長度太大,那麼函數調用過多? – Sage

+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] + "]"); 
} 
+0

但是,它不能正確打印數組。 –

+0

它是否真的需要遞歸? – lordkain

1

如果您試圖打印矩陣的每個元素一次,那麼其他答案中的解決方案都不會解決[編輯:我想我們現在只有一個答案]會有所幫助。他們會做的最多的是擺脫堆棧溢出錯誤,但輸出仍然不會接近你所需要的。

假設這是一項家庭作業,並且因爲某種原因被告知使用遞歸(現實生活中沒有人會這樣做),您必須退後一步並考慮這個問題:您想要什麼printMatrix(m,i,j)來做?假定您想要打印m[i][j]元素,然後打電話printMatrix來打印矩陣的其餘部分。當您遞歸調用printMatrix以啓動矩陣的剩餘打印時,您希望ij是什麼?可能,您需要相同的i和下一列j+1,但如果j位於該行的末尾,則不需要。然後你想......我會讓你考慮一下。但我不認爲你想printMatrix自己調用兩次。相反,你希望它自己調用一次(最多);你可能需要一個if聲明,看起來像

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

,但它仍然會調用自己只有一次(因爲它會選擇一個或其他)。

我會提到另一件事:您將i與數組中的行數進行比較(m.length),但您還將j與數組中的行數進行比較。這很好,如果你知道這是一個方形矩陣。但是,如果您想將j與列數進行比較,請將其與m[i].length進行比較,因爲m[i]本身就是一個數組(表示矩陣的一行)。

0

數組'm'的大小在整個遞歸調用中將保持不變。而i和j的價值將會改變,基本條件將只會被滿足。所以它無限地進入基地的條件是相同的我和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數組,看看它是否工作。 我希望它有幫助!

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

您應該添加一個解釋,而不是發佈僅限代碼的答案。謝謝! – mbomb007