0

文字列のすべての順列を印刷しようとしています。しかし、私の最善の努力にもかかわらず、私は自分のコードに必要な出力を得ることができません。誰かが私のコードに何が間違っているのか説明できますか?私はこれを何時間も試してきましたが、悲惨に失敗しました。文字列のすべての組み合わせを印刷するのに、バックトラッキングが機能していませんか?

以下のコードのために出力される: -

ABC

これはバックトラックのために並び替える機能である: -

int i, l = 2; 
void permute(String str, int n) 
{ 
    for(i=n;i<=l;i++) 
    { 
     if(n==l) 
     { 
      System.out.println(swap(str,n,i)); 
      return; 
     } 
     else 
      permute(swap(str,n,i),n+1); 
    } 
} 

これは、上記のコードを実行する主な機能であります: -

public static void main(String args[]) 
{ 
    BacktrackTest bt=new BacktrackTest(); 
    String c="abc"; 
    bt.permute(c,0); 
} 

これはスワップのためのコードである: -

String swap(String st, int s1, int s2) 
{ 
    char chr[] = st.toCharArray(); 
    char t; 
    t = chr[s1]; 
    chr[s1] = chr[s2]; 
    chr[s2] = t; 
    st = String.valueOf(chr); 
    return st; 
} 
+0

forループ 'i ++ 'のインクリメント条件は、そうでなければなりませんか?それは 'i - 'ではないでしょうか? – Omoro

+0

nが文字列の開始インデックスになり、lが終了になります。ループはnからlまで実行されます。だから、私は+ + –

+0

私はあなたのコードを試してみて、それはうまく動作している必要があります。それは 'abc acb bac bca cba cab'を各行ごとに独自の行に出力します。実行しているコードがあなたの質問のコードと同じであると確信していますか?編集:私の悪い、コピー貼り付け、私の答えを参照してください私はわずかな変更を加えた。 – walen

答えて

0

permute以外の方法でiを定義しないでください。これを試してみてください:

int l = 2; 
void permute(String str, int n) 
{ 
    for(int i=n;i<=l;i++) 
    { 
     if(n==l) 
     { 
      System.out.println(swap(str,n,i)); 
      return; 
     } 
     else 
      permute(swap(str,n,i),n+1); 
    } 
} 

をあなたはforループの外iを宣言した場合、それは価値が復帰した後、発信者のための「復元」されていないのです。
例では、if(n==l)と入力すると、iの値は2ですが、return;の後は、そのグローバルスコープのために2です。したがって、次の反復では3に増加し、したがってi<=lが偽となり、プログラムが終了します。
return;の後にiをループ内に宣言すると、ループが続行できるように1に戻ります。

+0

あなたは私の人を救った!出来た! –

+0

これがなぜ問題なのかをご理解いただけますか? –

+0

うん、ちょうど説明を追加しました。 – walen

関連する問題