需要帮助使用java创建氨基酸的排列系统

时间:2013-03-04 20:34:03

标签: java permutation

我的问题要求我根据用户估算的链长创建所有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");
}

由于

1 个答案:

答案 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个字符串。