Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 修改此代码以仅获取一个参数(字符组合的长度)?_Java_String_Recursion - Fatal编程技术网

Java 修改此代码以仅获取一个参数(字符组合的长度)?

Java 修改此代码以仅获取一个参数(字符组合的长度)?,java,string,recursion,Java,String,Recursion,我试图修改[here]中答案2中的java代码,使之有一个方法完成整个任务,并且只接受一个参数,即组合中的字符数,即在main中称为methodint 写一个与上面链接中的代码相同的递归代码实际上是一个家庭作业,即打印所需长度的所有字符组合,但在本例中是从一组固定的字符a、C、G和T,例如,如果调用method2,它将打印AA、AC、AG、AT、CA、CC 到目前为止,我只有: public static void printAllDNAs(int n) { String[] dna;

我试图修改[here]中答案2中的java代码,使之有一个方法完成整个任务,并且只接受一个参数,即组合中的字符数,即在main中称为methodint

写一个与上面链接中的代码相同的递归代码实际上是一个家庭作业,即打印所需长度的所有字符组合,但在本例中是从一组固定的字符a、C、G和T,例如,如果调用method2,它将打印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集合中每个字母的值,并将集合中的一个或多个字符附加到该集合中。谁能给我一个或两个提示,我该怎么做?非常感谢。

您可以尝试以下解决方案:

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);
    }
}
结果是:A AC-AG在C-CA-CG-CT-G-GA-GC-GT-T-TA-TC-TG

您可以随意添加任何修改,或者将其用作模板,因为prfx需要在函数外部使用字符串。用char[]替换它也使事情变得更简单、更快。请参阅下面的解决方案

如果您只需要一个功能:

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);
   }
}

非常感谢!唉,在这个算法和数据结构课程中,我们不允许使用额外的现成类,如ArrayList,除非另有规定。但我会从中学到很多,所以非常感谢。
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);
   }
}