2017-02-17 18 views
0

私は答えを見ずにコーディングの質問をしていますし、私は私の思考プロセスと間違っている括弧の有効なペアが見つかりませんか?

質問がカッコ

public class Foo{ 
    public void printCombinations(String prefix, int open, int close, int n){ 
     if (open > n) { 
      return; 
     } 
     if (close > n) { 
      return; 
     } 
     if (open == n && close == n){ 
      System.out.println(prefix); 
      return; 
     } 
     printCombinations(prefix + "(", open + 1, close, n); 
     printCombinations(prefix + ")", open, close + 1, n); 
    } 
    public static void main(String []args){ 
     HelloWorld w = new HelloWorld(); 
     w.printCombinations("", 0, 0, 3); 
    } 
} 
の有効なn個のペアのすべての組み合わせを見つけることであるものを見つけるのに苦労しています

このプログラムを実行したとき、有効なかっこ付きのものではなくすべての組み合わせが表示されたようです。私は考えていたprintCombinations(prefix + "(", open + 1, close, n);は、私は最初の開き括弧を再帰的にprintCombinations(prefix + ")", open, close + 1, n);)))(((のようなものと1つの出力を参照して呼び出しを印刷することを確認します。 (が最初に追加された場合、これはどのように可能ですか?

+0

申し訳ありませんが、私はそれがよく見えませんでしたので、私はそれを修正しました:p – loki

答えて

0

printCombinations(prefix + "(", open + 1, close, n)ための再帰呼び出しがスタックに終了した後、あなたのコードがprintCombinations(prefix + ")", open, close + 1, n)を再発し始めるためです。これは、)で始まる文字列出力の1つを取得する理由です。これらの2つの再帰呼び出しを置く順序ではありません。修正するには、closeが常にopen未満の条件が必要です。次のように、

public class Foo{ 
    public void printCombinations(String prefix, int open, int close, int n){ 
     if (open > n) { 
      return; 
     } 
     if (close > n) { 
      return; 
     } 
     if (open == n && close == n){ 
      System.out.println(prefix); 
      return; 
     } 
     printCombinations(prefix + "(", open + 1, close, n); 
     if (close < open) { 
      printCombinations(prefix + ")", open, close + 1, n); 
     } 
    } 
    public static void main(String []args){ 
     Foo w = new Foo(); 
     w.printCombinations("", 0, 0, 3); 
    } 
} 
関連する問題