【问题标题】:How to iterate n nested for loops each from 0 to n?如何迭代n个嵌套的for循环,每个循环从0到n?
【发布时间】:2020-07-02 11:25:29
【问题描述】:

例如,如果 n = 2

// Nested loop for all possible pairs 
    for (int i = 0; i < n; i++) { 
        for (int j = 0; j < n; j++) { 
            // here i have to use, i, j
        } 
    } 

例如,如果 n = 3

for (int i = 0; i < n; i++) 
        for (int j = 0; j < n; j++) 
            for (int k = 0; k < n; k++) 
                 // here i have to use, i, j, k

但是如果 n = k,那么如何从 0 到 n 迭代 n 个 for 循环呢?

我尝试了很多,但无法提出解决方案。

有什么办法吗?请帮忙。

【问题讨论】:

  • 你可以使用一个计数器数组cntr[n]和一个结转循环,也就是说,你从元素[0]向上遍历你的列表,只要增加一个元素会产生一个0 (即cntr[i] == n-1 在递增之前会产生结转到下一个位置)。当您可以在不产生0 的情况下增加一个计数器时,您会停止并发出您的计数器元组。我会留给你弄清楚何时停止计数。

标签: algorithm for-loop permutation


【解决方案1】:

你能用这样的递归函数测试它吗:

int foo(int n, int level)
{
  if(level == 0)
  {
    for(int i=0; i<n; i++){

     //Do something

    }
    
    return someValue;
  }

  for(int i=0; i<n; i++){
    foo(n, --level);
  }

}


//Start it with level = n like this
foo(n,n);

【讨论】:

    【解决方案2】:

    您可以使用数组作为索引。

    int indexes[n] = {0}; //initialize the whole array to zero
    while {
        //use indexes[0..n-1] as you would i, j, k, ...
        
        indexes[n-1]++;
        //propagate carry
        for(i = n-1; i > 0; i--) {
            if (indexes[i] == n) {
                indexes[i-1]++;
                indexes[i] = 0;
            }
            else break; //early exit from propagation, in case it's not necessary
        }
        if ( indexes[0] == n) break; 
    }
    

    【讨论】:

      【解决方案3】:

      我们可以使用递归解决方案(只有一个循环,其余是递归的力量),你只需要指定depth和@987654322 @哪里:


      深度 which specifies the level of nested for loops you want to use


      n size of each loop

      下面是c++实现

      #include <iostream>
      #include <vector>
      
      using namespace std;
      
      
      
      void loop(int n, int depth, vector<int> &iteration){
          if(!depth){
              for(auto x:iteration)
                  cout<<x<<" ";
              cout<<endl;
              return;
          }
      
          for(int i=0;i<n;i++){
              iteration[iteration.size()-depth] = i;
              loop(n, depth-1, iteration);
          }
      }
      
      int main(int argc, char const *argv[])
      {
      
          int depth = 3, n = 5;
      
          vector<int> iteration(depth);
      
          loop(n, depth, iteration);
          
          return 0;
      }
      

      输出

      0 0 0 
      0 0 1 
      0 0 2 
      0 0 3 
      0 0 4 
      0 1 0 
      0 1 1 
      0 1 2 
      0 1 3 
      0 1 4 
      0 2 0 
      0 2 1 
      0 2 2 
      0 2 3 
      0 2 4 
      0 3 0 
      0 3 1 
      0 3 2 
      0 3 3 
      0 3 4 
      0 4 0 
      0 4 1 
      0 4 2 
      0 4 3 
      0 4 4 
      1 0 0 
      1 0 1 
      1 0 2 
      1 0 3 
      1 0 4 
      1 1 0 
      1 1 1 
      1 1 2 
      1 1 3 
      1 1 4 
      1 2 0 
      1 2 1 
      1 2 2 
      1 2 3 
      1 2 4 
      1 3 0 
      1 3 1 
      1 3 2 
      1 3 3 
      1 3 4 
      1 4 0 
      1 4 1 
      1 4 2 
      1 4 3 
      1 4 4 
      2 0 0 
      2 0 1 
      2 0 2 
      2 0 3 
      2 0 4 
      2 1 0 
      2 1 1 
      2 1 2 
      2 1 3 
      2 1 4 
      2 2 0 
      2 2 1 
      2 2 2 
      2 2 3 
      2 2 4 
      2 3 0 
      2 3 1 
      2 3 2 
      2 3 3 
      2 3 4 
      2 4 0 
      2 4 1 
      2 4 2 
      2 4 3 
      2 4 4 
      3 0 0 
      3 0 1 
      3 0 2 
      3 0 3 
      3 0 4 
      3 1 0 
      3 1 1 
      3 1 2 
      3 1 3 
      3 1 4 
      3 2 0 
      3 2 1 
      3 2 2 
      3 2 3 
      3 2 4 
      3 3 0 
      3 3 1 
      3 3 2 
      3 3 3 
      3 3 4 
      3 4 0 
      3 4 1 
      3 4 2 
      3 4 3 
      3 4 4 
      4 0 0 
      4 0 1 
      4 0 2 
      4 0 3 
      4 0 4 
      4 1 0 
      4 1 1 
      4 1 2 
      4 1 3 
      4 1 4 
      4 2 0 
      4 2 1 
      4 2 2 
      4 2 3 
      4 2 4 
      4 3 0 
      4 3 1 
      4 3 2 
      4 3 3 
      4 3 4 
      4 4 0 
      4 4 1 
      4 4 2 
      4 4 3 
      4 4 4
      

      【讨论】:

        【解决方案4】:

        象征性地,您正在生成一个基数为nn 数字的所有值。您可以通过从全零开始并递增n^n 次来执行此操作。每当一个数字到达它们时,您就将其重置并进行下一个。

        例如n=3,

        000 001 002 010 011 012 020 021 022 100 101 102 110 111 112 120 121 122 200 201 202 210 211 212 220 221 222
        

        一个可能的实现是使用n 计数器。

        【讨论】:

          猜你喜欢
          • 2015-07-29
          • 1970-01-01
          • 2020-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-15
          • 1970-01-01
          • 2016-10-18
          相关资源
          最近更新 更多