2

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

谢谢

4

1 回答 1

4

在这种情况下,递归是你的朋友

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 ,那么它将调用getSubPermutations1这将通过 for 循环getSubPermutations再次调用第一个值和链长的字符串0。在这种情况下,字符串中将只有一个 T 代码。每个内部调用都会命中第一个 if 语句,因此它将打印出包含一个 T 代码的字符串并返回1。所有这些都将相加,因此返回的计数器getPermutations将为 20。到此阶段,所有排列都将被打印出来。

随着链长的增加getSubPermuations被称为递归。链长为的2它将调用getSubPermutations链长为 的 20 次1,传入 T 代码的字符串。这些中的每一个都getSubPermutations将以 0 的链长调用,并带有一个包含两个 T 代码的字符串。这将打印出完整的字符串并返回1。这些返回值将与前面的示例一样增加到 20,但是现在当它们返回到下一个级别时,它们相加以返回最终的 400 到getPermutations,并且将打印 400 个字符串。

于 2013-03-04T20:48:59.830 回答