如何动态控制for循环嵌套级别?

时间:2014-02-06 12:21:11

标签: java algorithm loops for-loop

我正在实现一些算法,其中循环嵌套级别的数量由输入确定。

例如,如果输入是二维的,那么有两个嵌套的for循环,如下所示:

for(int i=0; i<N; i++) {
    for(int j=i+1; j<N; j++) {
        if(table[i][j] == -1) {
            for(int c=0; c<C; c++) {
                int ii = table[i][c];
                int jj = table[j][c];
                sort(ii, jj);
                if((T[ii][jj] != -1 && T[ii][jj] < l)) {
                    T[i][j] = l;
                    break;
                }
             }
         }
     }
}

如果输入是三维的,那么它将如下所示:

for(int i=0; i<N; i++) {
    for(int j=i+1; j<N; j++) {
        for(int k=j+1; k<N; k++) {
            if(table[i][j][k] == -1) {
                for(int c=0; c<C; c++) {
                    int ii = table[i][c];
                    int jj = table[j][c];
                    int kk = table[k][c];
                    sort(ii, jj, kk);
                    if((T[ii][jj][kk] != -1 && T[ii][jj][kk] < l)) {
                        T[i][j][k] = l;
                        break;
                    }
                }
           }
      }
}

如果只有这两种情况,那么我可以编写两个版本的嵌套for循环。但输入的维度可以是2N之间的任何值。在这种情况下,如何动态地控制嵌套循环级别,或者有什么替代方法可以解决这个问题吗?

4 个答案:

答案 0 :(得分:3)

唯一真正的方法是使用递归。

你编写一个包含单个for循环的方法,如果它需要更深入,那么每次循环都会循环,然后方法调用自身,并运行该嵌套循环的正确设置。

答案 1 :(得分:1)

这里已经解释了递归。但是,还有另一种解决方案。只使用一个包含微小内环的大循环。

int n = ...;
int dim = ...;

// Raise n to the power of dim: powN = n^dim
long powN = 1;
for (int i = 0; i < dim; ++i) powN *= n;

int[] indices = new int[dim];
for (long i = 0; i < powN; ++i)
{
    // Calculate the indices
    long bigI = i;
    for (int k = 0; k < dim; ++k)
    {
         indices[k] = bigI % n;
         bigI /= n;
    }

    // Now all your indices are stored in indices[]

}

答案 2 :(得分:0)

我建议这样的事情:

public static void recursiveLoop(int N, int level, int a){
     if (level<0)
        return;
     for (int i=a; i<N; i++){
         System.out.println("Level is : "+ level+ " i: "+i );
         recursiveLoop(N,level-1,i+1);
     }
 }

答案 3 :(得分:0)

你可以解释一下你真正想做的事情。

如果外部for循环除了控制计数之外什么都不做,那么嵌套的for循环只是一种更复杂的迭代方式,可以通过单个{{1循环。

像:

for

相当于:

for (x = 0; x < 8; x++) {
  for (y = 0; y < 10; y++) {
    for (z = 0; z < 5; z++) {
      DoYourStuffs();
    }
  }
}