2017-01-13 16 views
0

したがって、nPr方法の後の文字列の置換のすべてを出力するコードを作成しようとしています.nは文字列の長さ、rは入力値です。接頭辞とStringと整数を取ります。これは、nPr順​​列の代わりにnPn順列を毎回印刷する点を除いて、これを行います。 R = 2の場合私の順列コードは毎回nPnを出力しますか?

public static void main(String[] args){ 
    String x = "abcd"; 
    permu("", x, 2); 
} 
public static void permu(String pre, String x, int r){ 
    if(x.length() == 0) 
     System.out.println(pre.substring(0, r)); 
    else{ 
     for(int i = 0; i < x.length(); i++) 
      permu(pre + x.charAt(i), x.substring(0, i) + x.substring(i + 1, x.length()), r); 
    } 
} 

、私はそれは、AB、AC、AD、BA、BC、BD、CA、CB、CD、DA、DB、DCを印刷したいです。それはすべての倍を印刷します。

答えて

1

再帰制限をr(今はn)に設定する必要があります。おそらくそうです:

if(x.length() == 0) 
change to 
    if(pre.length() == r) 
0

結果はあなたを驚かせるものではありません:あなたのコードは24のすべての順列を決定します。印刷時のみ最大長を適用します。 rは印刷時以外は使用されていないので、これを知ることができます。

あなたは、文字列全体を印刷する場合、結果は次のとおりです。

abcd 
abdc 
acbd 
acdb 
.... 

あなたは、本質的に完全な順列であるものの最初の文字を参照してください。

if (pre.length() == r) 
    System.out.println(pre.substring(0, r)); 

あなたが誰かがそれを呼び出したときにコードがまだ動作を確認することがありますが、4のうち2の本物のピックを持っているしたい場合は、r項目を選んだ後

、あなたは再帰を停止する必要があります文字列の長さよりも大きいrがあります。

if (pre.length() == r || x.length() == 0) 
    System.out.println(pre.substring(0, r)); 
+0

ありがとうございます。しかし、rはn以下でなければならないので、数学的にはできないと思った。 –

+0

誰でも 'permu(" "、" abcd "、12)を呼び出すことを止めない。このコードは、不正な入力に対する安全対策です。 –

関連する問題