-1
import java.io.*;
class combination
{
    static int cntr =  0;
    public static void main(String args[]) throws IOException
    {
        combination call = new combination();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Enter a String : ");
        String n = br.readLine();
        call.comb("",n);
        System.out.println("Number of combinations are : "+cntr);
    }
    public void comb(String beg, String end) throws IOException
    {
        if (end.length()<=1)
        {
            cntr++;
            System.out.println(beg+end);
        }
        else
        {
            for (int i=0;i<end.length();i++)
            {
                String n = end.substring(0,i)+end.substring(i+1);
                comb(beg + end.charAt(i),n);
            }
        }
    }
}

上記のプログラムは、特定の文字列の組み合わせを提供します。

再帰のコール フローを理解できません。上記の再帰プログラムの呼び出しの流れを知りたいです。

誰でもこれを説明できますか?

4

2 に答える 2

0

私が正しく理解していればcomb、文字列を取り、その文字列内の文字を再配置できるすべての方法を示します。たとえば、 を入力する"abc"と、プログラムは次の出力を返します。

abc
acb
bac
bca
cab
cba
Number of combinations are : 6

ここでの問題の一部は、combの名前が何が起こっているかについてあまり明確でないことです。私がこのコードを保守していた場合、名前begを to combinedCharsand endto uncombinedChars(または多分) に変更します。これは、この関数が再帰の各レベルでからにremainingChars1 文字を移動することで機能するためです。アルゴリズムは基本的に次のとおりです。endbeg

  • 合体できるキャラは1人だけ?
    • もしそうなら、それをすでにシャッフルされた文字と組み合わせる方法は1つしかないので、組み合わせて結果を出力し、カウントを更新します。
    • そうでない場合は、まだ結合されていない文字のリストを調べます。それぞれを組み合わせの次の文字として順番に取り、1 つだけになるまで、残りの結合されていない文字でプロセスを繰り返します。
于 2013-09-14T13:26:46.667 に答える