1

[こちら] の回答 2 の Java コードを変更しようとしていますが、文字列内の文字の組み合わせの生成が完全に機能しません。ジョブ全体を実行し、1 つのパラメーター (組み合わせ内の文字数) のみを受け取る 1 つのメソッドを作成します (つまり、main で method(int) として呼び出されます)。

上記のリンクのコードと同じことを行う再帰コードを書くことは、実際には宿題です。つまり、必要な長さのすべての文字の組み合わせを出力しますが、この場合、文字の固定セットから、A、C、G、および T (例: method(2) を呼び出すと、AA、AC、AG、AT、CA、CC...) が表示されます。

これまでのところ、私は次のものしか持っていません:

public static void printAllDNAs(int n) {
    String[] dna;
    dna = new String[4];
    dna[0] = "A";
    dna[1] = "C";
    dna[2] = "G";
    dna[3] = "T";

    String prfx = "";
    if (n == 0) {
        System.out.println(prfx);
    } else {
        for (int i = 0; i < dna.length; i++) {
            System.out.print(prfx + dna[i]);
            printAllDNAs(n - 1);
        }
    }
}

public static void main(String[] args) {
    printAllDNAs(3);
}
}

これは明らかにまったく正しくありません。セット内の各文字の値を順番に prfx に与え、セットから 1 つ以上の文字を追加する必要があることを理解しています。誰かが私がこれをどのように進めるべきかのヒントを教えてもらえますか? 大変感謝しています。

4

2 に答える 2

0

この解決策を試すことができます:

public static void printDNARecursive(ArrayList<String> dnaCombinations, String prefix, String[] dnaArray, int depth) {
    if (prefix.length() == depth || dnaArray.length == 0) {
        return;
    }
    for (int i = 0; i < dnaArray.length; i++) {
        String dna = dnaArray[i];
        if (dna == null) {
            continue;
        }
        dnaCombinations.add(prefix + dna);
        String[] copyOf = Arrays.copyOf(dnaArray, dnaArray.length);
        copyOf[i] = null;
        printDNARecursive(dnaCombinations, prefix + dna, copyOf, depth);
    }
}

仕組み - このコードは、DNA を印刷する代わりに使用してスクリーニングし、dnaCombinations変数内に保存します。あなたの DNA が最大深度 (depth変数として) の長さに達した場合、それ以上は進みません。

dnaCombinations内側にもあるので、あなたとは少し異なりますが、お好みの長さの紐のみ"A", "C", "G", "T"から印刷できます。dnaCombinations

これがどのように機能するかの小さな例:

public static void main(String... args) {
    String[] dna = new String[] { "A", "C", "G", "T"};
    ArrayList<String> result = new ArrayList<String>();
    printDNARecursive(result, "", dna, 2);
    for (String d : result) {
        System.out.println(d);
    }
}

結果は次のとおりです。A AC AG AT C CA CG CT G GA GC GT T TA TC TG

自由に変更を加えるか、単にテンプレートとして使用してください

于 2013-02-04T07:51:52.873 に答える
0

String prfx関数の外にある必要があります。これを a に置き換えると、作業char[]がはるかに簡単かつ高速になります。以下の解決策を参照してください。

1 つの関数だけが必要な場合:

private static char arr[];
private static final char[] dna = "ACGT".toCharArray();
public static void printAllDNAs(int n)
{
   if (arr == null)
      arr = new char[n];
   if (n == 0)
   {
      System.out.println(String.valueOf(arr));
      return;
   }
   for (char c: dna)
   {
      arr[n-1] = c;
      printAllDNAs(n-1);
   }
   if (n == arr.length)
      arr = null;
}

複数の機能を気にしないのであれば、これはおそらくより良いでしょう(+非常にわずかに高速です):

public static void printAllDNAs(int n)
{
  arr = new char[n];
  printAllDNAsInternal(n);
}

private static void printAllDNAsInternal(int n)
{
   if (n == 0)
   {
      System.out.println(String.valueOf(arr));
      return;
   }
   for (char c: dna)
   {
      arr[n-1] = c;
      printAllDNAs(n-1);
   }
}
于 2013-02-04T11:00:23.390 に答える