Есть ли способ сделать n-уровневые вложенные циклы в Java? - PullRequest
24 голосов
/ 09 января 2009

Другими словами, могу ли я сделать что-то вроде

for() {
    for {
       for {
       }
    }
}

Кроме N раз? Другими словами, когда вызывается метод, создающий циклы, ему присваивается некоторый параметр N, и метод затем создает N из этих циклов, вложенных друг в друга?

Конечно, идея заключается в том, что должен быть «простой» или «обычный» способ сделать это. У меня уже есть идея для очень сложной.

Ответы [ 14 ]

0 голосов
/ 11 февраля 2017

я впервые отвечаю на вопрос, но я чувствовал, что мне нужно поделиться этой информацией из `

for (x = 0; x < base; ++x) {
  for (y = 0; y < loop; ++y) {
      DoSomething();
  }
}

эквивалентно

for (x = 0; x < base*loop; ++x){
    DoSomething();
}

поэтому, если вам нужно n гнезд, это можно записать с использованием деления между base и loop, чтобы это выглядело так просто:

char[] numbs = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
     public void printer(int base, int loop){
       for (int i = 0; i < pow(base, loop); i++){
         int remain = i;
         for (int j = loop-1; j >= 0; j--){
           int digit = remain/int(pow(base, j));
           print(numbs[digit]);
           remain -= digit*pow(base, j);
         }
         println();
       }
     }

поэтому, если бы вы набрали printer(10, 2);, это вывело бы:

00
01
02
03
04
...
97
98
99
0 голосов
/ 18 февраля 2013

Для краткости я выкладываю свой код здесь:

void variDepth(int depth, int n, int i) {
    cout<<"\n d = "<<depth<<" i = "<<i;
    if(!--depth) return;
    for(int i = 0;i<n;++i){
        variDepth(depth,n,i);
    }
}
void testVariDeapth()
{   variDeapth(3, 2,0);
}

выход

 d = 3 i = 0
 d = 2 i = 0
 d = 1 i = 0
 d = 1 i = 1
 d = 2 i = 1
 d = 1 i = 0
 d = 1 i = 1
0 голосов
/ 20 мая 2012
public void recursiveFor(Deque<Integer> indices, int[] ranges, int n) {

    if (n != 0) {

       for (int i = 0; i < ranges[n-1]; i++) {

          indices.push(i);
          recursiveFor(indices, ranges, n-1);
          indices.pop();
       }
    }

    else {

       // inner most loop body, access to the index values thru indices
       System.out.println(indices);
    }
}

Пример вызова:

int[] ranges = {2, 2, 2};

recursiveFor(new ArrayDeque<Integer>(), ranges, ranges.length);
0 голосов
/ 22 августа 2011
String fors(int n){
StringBuilder bldr = new StringBuilder();
for(int i = 0; i < n; i++){
    for(int j = 0; j < i; j++){
        bldr.append('\t');
    }
    bldr.append("for() {\n");
}
for(int i = n-1; i >= 0; i--){
    for(int j = 0; j < i; j++){
        bldr.append('\t');
    }
    bldr.append("}\n");
}
return bldr.toString();
}

Создает хороший вложенный скелет для цикла ;-) Не совсем серьезно, и я знаю, что рекурсивное решение было бы более элегантным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...