2013-10-16 105 views
15

我有必须执行以下操作的方法:如何使n个嵌套for循环递归?

for (int a01 = 1; a01 <= 25; a01++) { 
    for (int a02 = a01 + 1; a02 <= 25; a02++) { 
     for (int a03 = a02 + 1; a03 <= 25; a03++) { 
      ... 
      System.out.println(a01 + "," + a02 + "," + ... + "," + a015); 
     } 
    } 
} 

我想指定的嵌套对的数量(在上述情况下,我想15嵌套了的)。 有没有办法在这里使用递归编程?

+14

请不要。不要这样做。 –

+4

只需创建一个方法并让它自己调用15次。这是一个真正的递归方法。 – BalusC

+1

@SotiriosDelimanolis谨慎解释为什么? ;-) –

回答

15

是的。这可以通过递归编程来执行。

我假设你不喜欢把这些嵌套的代码写在源代码中 - 就像在你的例子中那样,因为这是非常丑陋的编程 - 就像评论员解释的那样。

以下(伪Java样)代码说明了它。我假设嵌套的深度是固定的。然后,您实际上喜欢遍历维度深度的整数向量。

int[] length = new int[depth]; 
int[] counters = new int[depth]; 

阵列counters必须被初始化为0(Arrays.fill(counters,0))。必须将数组length初始化为相应for循环的迭代次数。

我假设你喜欢在内循环内执行某个操作。我会称之为 performOperation(int[] counters); - 它取决于多维计数器,即外部计数器的计数器。

然后你就可以通过调用

nestedLoopOperation(counters, length, 0); 

其中

void nestedLoopOperation(int[] counters, int[] length, int level) { 
    if(level == counters.length) performOperation(counters); 
    else { 
     for (counters[level] = 0; counters[level] < length[level]; counters[level]++) { 
      nestedLoopOperation(counters, length, level + 1); 
     } 
    } 
} 

在你的情况下运行嵌套的for循环您的System.out.println()将

performOperation(int[] counters) { 
    String counterAsString = ""; 
    for (int level = 0; level < counters.length; level++) { 
     counterAsString = counterAsString + counters[level]; 
     if (level < counters.length - 1) counterAsString = counterAsString + ","; 
    } 
    System.out.println(counterAsString); 
} 
+0

你的内部函数调用缺少一个参数“length”。 – Teepeemm

+0

谢谢。我开始编写伪代码,然后做了Java,但没有检查它是否编译 - 在没有IDE的情况下直接写入。 –

+0

我在将它转换为Python后试用了这段代码。所以深度决定了Vector的大小,也就是循环中有多少个嵌套,但这些矢量的值应该是多少?看起来像Length应该总是深度的(例如[3,3,3]),而Counter就是它在循环中的任何东西(对于[0,1,2],如果你只想从0开始并在max之后停止-1)? – ackmondual

1

我创建了这个程序来显示卡片的所有不同组合(非重复)。它使用循环递归。也许它可以帮助你。

//I'm lazy, so yeah, I made this import... 
import static java.lang.System.out; 

class ListCombinations { 

    //Array containing the values of the cards 
    static Symbol[] cardValues = Symbol.values(); 

    //Array to represent the positions of the cards, 
    //they will hold different card values as the program executes 
    static Symbol[] positions = new Symbol[cardValues.length]; 

    //A simple counter to show the number of combinations 
    static int counter = 1; 

    /*Names of cards to combine, add as many as you want, but be careful, we're 
    talking about factorials here, so 4 cards = 24 different combinations (4! = 24), 
    but 8 cards = 40320 combinations and 13 cards = 6.23 billion combinations!*/ 
    enum Symbol { 
     AofSpades, TwoofSpades, ThreeofSpades, FourofSpades 
    } 

    public static void main(String args[]) { 

     //I send an argument of 0 because that is the first location which 
     //we want to add value to. Every recursive call will then add +1 to the argument. 
     combinations(0); 
    } 

    static void combinations(int locNumber) { 

     /* I use a recursive (repeating itself) method, since nesting for loops inside 
     * each other looks nasty and also requires one to know how many cards we will 
     * combine. I used 4 cards so we could nest 4 for loops one after another, but 
     * as I said, that's nasty programming. And if you add more cards, you would 
     * need to nest more for loops. Using a recursive method looks better, and gives 
     * you the freedom to combine as many cards as you want without changing code. */ 

     //Recursive for loop nesting to iterate through all possible card combinations 
     for(int valueNumber = 0; valueNumber < cardValues.length; valueNumber++) { 
      positions[locNumber] = cardValues[valueNumber]; 
      if (locNumber < (cardValues.length-1)) { 
       combinations(locNumber + 1); 
      } 

      //This if statement grabs and displays card combinations in which no card value 
      // is repeated in the current "positions" array. Since in a single deck, 
      // there are no repeated cards. It also appends the combination count at the end. 
      if (locNumber == (cardValues.length-1) && repeatedCards(positions)) { 
       for (int i = 0; i < cardValues.length; i++) { 
       out.print(positions[i]); 
       out.print(" "); 
       } 
       out.printf("%s", counter); 
       counter++; 
       out.println(); 
      } 
     } 
    } 

    static boolean repeatedCards(Symbol[] cards) { 

     /*Method used to check if any cards are repeated in the current "positions" array*/ 

     boolean booleanValue = true; 

     for(int i = 0; i < cardValues.length; i++) { 
      for(int j = 0; j < cardValues.length; j++) { 
       if(i != j && cards[i] == cards[j]) { 
        booleanValue = false; 
       } 
      } 
     } 
     return booleanValue; 
    } 
}