2

私の問題では、ユーザーが推定した鎖長に基づいて、20 個のアミノ酸順列すべてのリストを作成する必要があります。たとえば、現在、ユーザーが 3 チェーンの長さを希望する場合に機能するコードがあります。これは 20^3 の可能性です。したがって、すべての可能性を実行する 3 つのネストされた for ループがあり、次に、順列の数を出力して答えが正しいことを確認するカウンターがあります。ユーザー入力に基づいて順列を出力するように、このメソッドをどのようにコーディングできますか?

protected void getPermutations(int chainlength) {
    int counter = 0;
    for (int i = 0; i < 20; i++) {
        for (int j = 0; j < 20; j++) {
            for (int k = 0; k < 20; k++) {
                System.out.println(AcidArray[i].getTcode() + "-"
                        + AcidArray[j].getTcode() + "-"
                        + AcidArray[k].getTcode());
                counter++;
            }
        }
    }
    System.out.println("chain length = " + chainlength);
    System.out.println(counter + " permutations");
}

ありがとう

4

1 に答える 1

4

この状況では、再帰はあなたの味方です

protected String getPermutations(int chainlength) {
    int counter = 0;
    if(chainlength > 0) { // so that the counter is not 1
        counter = getSubPermutations("", chainlength));
    }
    System.out.println("chain length = " + chainlength);
    System.out.println(counter + " permutations");
}

private int getSubPermutations(String prefix, int chainlength){
   if(chainlength == 0){ //The bottom of the stack, print out the combination
      System.out.println(prefix.substring(0,prefix.length-1)); //remove the final '-'
      return 1;
   } else {
      int counter = 0
      for(int i = 0; i < 20; i++) {
        //Add this level T code to the string and pass it on
        counter += getSubPermutations(prefix + AcidArray[i].getTcode() + "-", chainlength-1);
      }
      return counter;
   }
}

これが行うことは、呼び出しのツリーを作成することです。chainlength が 1 の場合、 で呼び出さgetSubPermutations1ます。getSubPermutationsこれは、最初の値の文字列と のチェーン長で再度for ループ呼び出しを実行します0。この場合、文字列には T コードが 1 つだけ含まれます。各内部呼び出しは最初の if ステートメントにヒットするため、1 つの T コードを含む文字列を出力してを返し1ます。これらはすべて加算されるため、返されるカウンターはgetPermutations20 になります。この段階までに、すべての順列が出力されます。

チェーンの長さが増加するgetSubPermuationsと、再帰的に呼び出されます。chainlength の場合、T コードの文字列を渡し、chain length で 20 回2呼び出します。これらのそれぞれは、2 つの T コードを含む文字列を使用して、チェーン長 0 で呼び出します。これにより、完全な文字列が出力され、 が返されます。これらの戻り値は、前の例のように 20 まで加算されますが、次のレベルに戻されると、最終的な 400 を返すために加算され、400 文字列が出力されます。getSubPermutations1getSubPermutations1getPermutations

于 2013-03-04T20:48:59.830 に答える