【问题标题】:How to dynamically control the for-loop nested level?如何动态控制for循环的嵌套层次?
【发布时间】:2014-03-03 09:27:51
【问题描述】:

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

例如,如果输入是二维的,则有两个嵌套的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;
                }
             }
         }
     }
}

如果输入是 3 维的,则如下所示:

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 之间的任何值。在这种情况下,如何动态控制嵌套循环级别,或者有什么替代方法可以解决这个问题?

【问题讨论】:

  • 我认为递归在这里应该可以提供帮助!

标签: java algorithm loops for-loop


【解决方案1】:

做到这一点的唯一真正方法是使用递归。

您编写一个包含单个 for 循环的方法,如果需要更深入,则每次在循环周围时,该方法都会使用正确的设置调用自身以运行该嵌套循环。

【讨论】:

  • 这不是唯一的方法。检查我的答案。
  • 你能根据我的详细例子写一些代码吗?谢谢
【解决方案2】:

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

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[]

}

【讨论】:

    【解决方案3】:

    我的建议是这样的:

    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);
         }
     }
    

    【讨论】:

      【解决方案4】:

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

      如果外部 for 循环除了控制计数之外什么都不做,那么您的嵌套 for 循环只是一种更复杂的迭代计数的方法,可以由单个 for 循环处理。

      喜欢:

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

      相当于:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 1970-01-01
        • 2020-08-23
        • 2011-03-26
        • 2012-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多