2017-07-02 13 views
2

標準出力にパスカル三角形を印刷するために再帰的メソッドを使用しようとします。私は、メソッドをどのように動作させたいのかというアイデアを得るための反復メソッドを作成することから始めました。以下のコードを参照してください。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) 

の署名が、私は、再帰的な方法で作業を始めました。私は印刷のためのクラス変数を使用することはできません - 私はベクトルを使用することはできません。私はオブジェクトを持つことができない、メソッドがあるクラス、2つのメソッドとメインは私が実装することができる唯一のメソッドです。 最大の問題は、各反復後にリセットされるため、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

申し訳ありませんが、私が言及したように: "2つの方法とメインは私が実装できる唯一の方法です。 –

+0

これは明らかです: mainを使用して、binomメソッドを使用してパスカル三角形を印刷するRECURSIVE(繰り返しはできません)メソッドを呼び出す必要がありますか? –

+0

はい、そうです。実装を少し変更しました。 –

関連する問題