如何在运行时更改嵌套循环的数量?

时间:2014-04-16 18:47:12

标签: java arrays loops nested-loops

我该怎么做?让 k 为用户提供一个整数,我需要"动态建立" k 级别的嵌套循环,例如:

如果 k = 5,则:

int[] a = new int[k];
for(int i=0; i<256; i++){
    for(int j=0; j<256; j++){
        for(int ke=0; ke<256; ke++){
            for(int l=0; l<256; l++){
                for(int m=0; m<256; m++){
                    a[0] = i;
                    a[1] = j;
                    a[2] = ke;
                    a[3] = l;
                    a[4] = m;
                    if (isCap(a)) //do something;
                }
            }
        }
    }
}

但如果 k = 3,则:

int[] a = new int[k];
for(int i=0; i<256; i++){
    for(int j=0; j<256; j++){
        for(int ke=0; ke<256; ke++){
            a[0] = i;
            a[1] = j;
            a[2] = ke;
            if (isCap(a)) //do something;                
        }
    }
}

3 个答案:

答案 0 :(得分:0)

使用递归:

int[] a = new int[k];
loop(256,0,a);

void loop(int length, int k, int[] a){
  if(k<a.length) // the array determines the maximum depth, you could pass the size instead
    for(int i=0; i<length; i++) {
      loop(length,k+1,a);
      a[k] = i;
      if(k==a.length-1){ // this will only execute in the innermost loop
        if (isCap(a)) doSomething();
      }
    }
}

你也可以把它写成:

void loop(int length, int k, int[] a){
  if(k<a.length)
    for(int i=0; i<length; i++) {
      loop(length,k+1,a);
      a[k] = i;
    }
  else if (isCap(a)) doSomething();
}

如果你需要在生产中使用它,请调试上面的代码,我还没有测试过,但是你得到了这个概念。

答案 1 :(得分:0)

这就是递归的目的。

void recursiveInteration(int[] a, int currentIndex) {
   if (currentIndex <0) {
     //do something with a
     return;
   }
   for (int i=0; i< 256; ++i) {
     a[currentIndex] = i;
     recursiveInteration(currentIndex-1);
   }
}

你可以按如下方式使用它:

recursiveInteration(a, 5);

答案 2 :(得分:0)

似乎你有生成所有k坐标皮质的任务,其中k beetwen 0(包括)和256(不包括)并使用你的函数isCap()检查它们。 我建议你写两个函数:增加cortage: inc([0,0,0,0,0]) = [0,0,0,0,1]inc([12,13,15,5,255]) = [12,13,15,6,0]

并检查功能测试,如果cortage是最大的。在你的情况下:

boolean isCortageMaximum(a){
      return a == [255,255,255,255,255];
}

然后你的循环将跟随:

while(!isCortageMaximum(a)){
   if(isCap(a){
     //your actions here
   }
   inc(a);
}