我正在实现一些算法,其中循环嵌套级别的数量由输入确定。
例如,如果输入是二维的,那么有两个嵌套的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循环。但输入的维度可以是2
和N
之间的任何值。在这种情况下,如何动态地控制嵌套循环级别,或者有什么替代方法可以解决这个问题吗?
答案 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();
}
}
}