2016-03-22 7 views
0

私はあなたがループを再帰関数に変えることができることを読んだので、以下のコードをどのように回すことができるのだろうかと思っていました(文字列の置換)を1つに置き換えます(forループを再帰関数に置き換えます)。私は解決策を求めているのではなく、そのような課題にアプローチする考え方を求めています。ありがとう!forループを再帰関数に変更する

private static void permutation(String prefix, String str) { 

int n = str.length(); 

    if (n == 0) System.out.println(prefix); 

    else { 

    for (int i = 0; i < n; i++) 
     permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n)); 
    } 
} 

ありがとうございました!

+6

への呼び出しでループのために変更します。 – redFIVE

+0

上記の例では、すでに再帰を使用しています。詳細は次のとおりです:http://introcs.cs.princeton.edu/java/23recursion/ – ManoDestra

+0

メソッドの中にforループがあっても、それ自身の中で関数を呼び出すことで、依然として再帰を実行しています。 –

答えて

0

private static void permutation(String prefix, String str, int i, int j) { 

が、その後forループを省略し、順列の先頭に

if(i < j){ 

を境界条件を追加して、あなたの既に再帰的に、下限と上限を表現するためのパラメータを追加します。置換の呼び出し、

permutation(..., i+1, j); 

最後に、あなた最初はあなたの他のコードから呼び出し、0とパラメータstrの.length()をiとjの値として渡します。

もう1つのパーミュテーション(...)オーバーロードを作成して2つの余分なパラメータを使用することもできるため、最初の呼び出しで把握する必要はありません。

コード内でn周辺の冗長性の一部を削除することはできますが、これを行わずにこの作業を行うことができます。

1

契約を変更しない場合は、ヘルパーを作成して契約を変更します。

private static void permutationFor(int i, int n, String prefix, String str) { 
    if(i < n) { 
     permutation(prefix + str.charAt(i), 
        str.substring(0, i) + str.substring(i+1, n)); 
     permutationFor(i+1, n, prefix, str); 
    } 
} 

したがって、あなたが実際に何を意味するのか、再帰上に読むべき....再帰的であるpermututaionFor

private static void permutation(String prefix, String str) { 
    int n = str.length(); 
    if (n == 0) { 
     System.out.println(prefix); 
    } else { 
     premutationFor(0, n, prefix, str); 
    } 
} 
+0

@AndrewJacobsよろしくお願いします。:-) – Sylwester