代码之家  ›  专栏  ›  技术社区  ›  CAMILO HG

在C语言中,如何编写N维嵌套for循环,其中N是变量

  •  0
  • CAMILO HG  · 技术社区  · 7 年前

    我需要写声明:

    for ( int i1 = i1_min; i1 < width; ++i1 )
        for ( int i2 = i2_min; i2 < i2_max; ++i2 )
            for ( int i3 = i3_min; i3 < i3_max; ++i3 )
                ...
                    for ( int iN = iN_min; iN < iN_max; ++iN )
    

    怎么做?

    3 回复  |  直到 7 年前
        1
  •  5
  •   Patrick Roberts Benjamin Gruenbaum    7 年前

    可以编写递归函数来执行此操作:

    void loopn\u递归(int*min,int*max,int*counters,size\t N,size\t N,void(*func)(int*,size\t)){ 对于(int i=最小值[n];i<最大值[n];++i){ 计数器【n】=i; 如果(N-N>1){ loopn\u递归(最小、最大、计数器、N、N+1、func); }其他{ //最内层算法 func(计数器,N); } } } void loopn(int*min,int*max,int*counters,size\u t N,void(*func)(int*,size\u t)){ 断言(N>0); loopn\u递归(最小、最大、计数器、N、0、func); } //示例用法 无效测试(int*计数器,size\t N){ 对于(大小\u t j=0;j<N;++j){ printf(“%d”,计数器[j]); } putchar(“\n”); } loopn((int[]){1,2,3,4,5},(int[]){2,4,6,8,10},(int[5]){},5,test);

    在线试用

    在线试用!

        2
  •  1
  •   Jakub Piskorz    7 年前

    可以将N维空间表示为一维,并使用一个索引,如果需要,可以从中计算N个子索引。

    下面我附上这种空间展平的示例实现

    #include <stdio.h>
    
    int bonds[][2] = {
      {1, 2},
      {5, 10},
      {0, 3},
      {6, 8}
    };
    
    int get_index(int index_position, int current, int sizes[], int sizes_size) {
      int mod = 1;
      for(int i = index_position; i < sizes_size; i++) {
        mod *= sizes[i];
      }
    
      int div = mod / sizes[index_position];
    
      return (current % mod) / div;
    }
    
    int main(int argc, char** argv) {
    
      int sizes[] = {
        bonds[0][1] - bonds[0][0],
        bonds[1][1] - bonds[1][0],
        bonds[2][1] - bonds[2][0],
        bonds[3][1] - bonds[3][0]
      };
    
      int big_size = sizes[0] * sizes[1] * sizes[2] * sizes[3];
    
      for(int i = 0; i < big_size; i++) {
        /* get indexes */
    
        /*
        int i0 = ((i % (sizes[0] * sizes[1] * sizes[2] * sizes[3])) / (sizes[1] * sizes[2] * sizes[3])) + bonds[0][0];
        int i1 = ((i % (           sizes[1] * sizes[2] * sizes[3])) / (           sizes[2] * sizes[3])) + bonds[1][0];
        int i2 = ((i % (                      sizes[2] * sizes[3])) / (                      sizes[3])) + bonds[2][0];
        int i3 = ((i % (                                 sizes[3]))                                   ) + bonds[3][0];
        */
    
        int i0 = get_index(0, i, sizes, 4) + bonds[0][0];
        int i1 = get_index(1, i, sizes, 4) + bonds[1][0];
        int i2 = get_index(2, i, sizes, 4) + bonds[2][0];
        int i3 = get_index(3, i, sizes, 4) + bonds[3][0];
    
        printf("%d %d %d %d\n", i0, i1, i2, i3);
      }
    
      return 0;
    }
    

    动态处理键/大小数组在此不适用。该示例显示了如何从展平空间计算子索引。

        3
  •  0
  •   Chul-Woong Yang    7 年前

    如果您需要对真正的变量N执行操作,那么Patrick的递归操作就是一种方法。

    如果你想做的是 固定的 变量N,并且您试图避免重复键入for loop,可以使用宏保存一些击键:

    #define LOOP(N) for (int i#N = i#N#_min; i#N < i#N#_max; ++i#N )
    
    LOOP(1)
    LOOP(2)
    LOOP(3)
    LOOP(4)
    LOOP(5) {
       val = i1+i2+i3+i4+i5; // example calculation
    }