2017-07-02 79 views
2

我會嘗試使用遞歸方法將pascals三角形打印到標準輸出。我開始通過一種迭代方法來了解我如何使該方法起作用。請參閱下面的代碼。Java:更多的遞歸方法

/** 
    * Print Pascal's triangle with PrintOut. 
    * 
    * @param n The amount of rows in total 
    */ 
public static void printPascal (int n) { 
    for (int i = 0; i <n; i ++) { 
     System.out.format ("%" + (n-i) * 3 + "s", ""); 
     for (int j = 0; j <= i; j ++) { 
      System.out.format ("% 6d", binom (i, j)); 
     } 
     System.out.println(); 
    } 
} 

Javadoc和binom

/** 
    * Method which calculates the values ​​in Pascal's triangle. 
    * @param n  The row of "the place" 
    * @param k  The column of "the place" 
    * @return  A value on "the place" from the triangle 
    */ 
public static int binom (int n, int k) 

的簽名然後我開始對遞歸方法工作。我無法使用任何類變量進行打印 - 所以我無法使用矢量。我不能有任何對象,方法所在的類,這兩種方法和main是我可以實現的唯一方法。 最大的問題是我無法保存binom應該使用的變量,因爲它們在每次迭代後重置。 現在我有這個代碼printPascal:

if (n < 0) { 
    return; 
} 
printPascal (n-1); 
for (int k = 0; k <= n; k++) { 
    System.out.format ("%6d", binom(n, k)); 
} 
System.out.println(); 

有沒有一種方法,使上面的方法更遞歸 - 有沒有辦法帶走for循環? 在圖中,您可以看到輸出是如何使用迭代方法的。 Output

+1

請總是使用花括號與if和for。將函數調用移動到新行。上次發佈的代碼很難分析。 –

+0

謝謝@AdrianAdamczyk我是新來的。 :) –

回答

0

我希望這有助於嗎?

public class PascalTriangle { 
    public static void main(String[] args) { 
     printPascal(5); 
    } 

    private static void printPascal(int i) { 
     auxPrintPascal(0, i); 
    } 

    private static void auxPrintPascal(int row, int numOfRows) { 
     if (row > numOfRows) { 
      return; 
     } 
     printPascalTriangleRow(row, 0); 
     System.out.println(); 
     auxPrintPascal(row + 1, numOfRows); 
    } 

    private static void printPascalTriangleRow(int row, int col) { 
     if (col > row) { 
      return; 
     } 
     System.out.print(binomial(row, col) + " "); 
     printPascalTriangleRow(row, col + 1); 
    } 

    private static long binomial(int n, int k) { 
     if (k > n - k) 
      k = n - k; 

     long b = 1; 
     for (int i = 1, m = n; i <= k; i++, m--) 
      b = b * m/i; 
     return b; 
    } 
} 

如果你堅持,這應該工作?

private static void sillyPrintPascal(int row, int col, int numOFRows) { 
     if (row > numOFRows) { 
      return; 
     } 
     if (col > row) { 
      return; 
     } 
     System.out.print(binomial(row, col) + " "); 
     if (col == row) { 
      System.out.println(); 
      sillyPrintPascal(row + 1, 0, numOFRows); 
     } else { 
      sillyPrintPascal(row, col + 1, numOFRows); 
     } 
    } 
+0

對不起,但正如我所說:「這兩種方法和主要是我可以實現的唯一方法。」 –

+0

所以要清楚: 您需要使用main調用RECURSIVE(不能是迭代?)方法,該方法使用binom方法打印出pascal三角形? –

+0

是的,沒錯。我現在已經改變了我的實施。 –