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