Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamically change the number of nested for loops

Tags:

java

dynamic

I don't know if this is a stupid question, but I need to dynamically change the number of for-loops without using recursion.

For example, if n=3, I need 3 nested for-loops.

for(int i=0; i<size; i++){
   for(int j=0; j<size-1; j++){
       for(int k=0; k<size-2; k++){
          //do something
       }
   }
}

If n=5:

for(int i=0; i<size; i++){
   for(int j=0; j<size-1; j++){
       for(int k=0; k<size-2; k++){
          for(int l=0; l<size-3; l++){
              for(int m=0; m<size-4; m++){
                  //do something
              }
          }
       }
   }
}

Is there any way to achieve this without recursion? Another question: what is the use of Multiple Dispatch in Java? I'm trying to code something in ONE METHOD, and it should run different events in different cases of the parameter. NO IF STATEMENTS / TERNARY OPERATORS / CASES.

NOTE: I can ONLY have one method (part of the problem), and cannot use recursion. Sorry.

like image 224
Stevantti Avatar asked Nov 27 '13 18:11

Stevantti


3 Answers

Think about how many times you run through this loop. It looks like (size!) / (size - n)!:

int numLoops = 1;
for (int i = 0; i < n; i++) {
    numLoops*= (size - i);
}

for (int i = 0; i < numLoops; i++) {
    //do something
}
like image 121
quazzieclodo Avatar answered Oct 18 '22 16:10

quazzieclodo


It depends what exactly you're trying to do. Recursion can always be replaced with iteration (see this post for examples using a Stack to store state).

But perhaps the modulo (%) operator could work here? i.e. Have a single loop that increments a variable (i) and then the other variables are calculated using modulo (i % 3 etc). You could use a Map to store the values of the variables indirectly, if there are a varying number of variables.

like image 20
ᴇʟᴇvᴀтᴇ Avatar answered Oct 18 '22 15:10

ᴇʟᴇvᴀтᴇ


You have to create array of loop counters and increment it manually.

Quick and dirty example:

public static void nestedFors(int n, int size) {
  assert n > size;
  assert size > 0;

  int[] i = new int[n];
  int l = n - 1;
  while(l >= 0) {
    if(l == n - 1) {
      System.out.println(Arrays.toString(i));
    }
    i[l]++;
    if(i[l] == size - l) {
      i[l] = 0;
      l--;
    } else if(l < n - 1) {
      l++;
    }
  }
}

Replace System.out.println(Arrays.toString(i)) with your own code.

You can check it here: http://ideone.com/IKbDUV

like image 43
Nikolay Avatar answered Oct 18 '22 15:10

Nikolay