我的问题要求我根据用户估算的链长创建所有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");
}
由于
答案 0 :(得分:4)
Recursion是你的朋友
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,则会使用getSubPermutations
调用1
。这将通过for循环再次调用getSubPermutations
,并使用第一个值的字符串和0
的链长。在这种情况下,字符串中只有一个T代码。每个内部调用都将触及第一个if语句,因此它将打印出包含一个T代码的字符串并返回1
。所有这些都将被加起来,因此返回getPermutations
的计数器将为20.在此阶段,所有排列都将被打印出来。
随着链长增加getSubPermuations
被递归调用。链长为2
时,它会调用getSubPermutations
20次,链长为1
,并传入T代码的字符串。其中每个都会调用getSubPermutations
,链长为0,,字符串包含两个T代码。然后,这将打印出完整的字符串并返回1
。这些返回值最多可以添加到20,如上例所示,但现在当它们返回到下一级时,它们会相加,最后将400返回getPermutations
,并且将打印400个字符串。