c++for-loopnested

variable nested for loops


I'm trying to figure out how I can use recursion to do n-level nested for loops. For example, if n=3, there would be 3 'levels'

for(z=0;z<6;z++){
   for(y=0;y<6;y++){
      for(x=0;x<6;x++){
         if (z+y+x==f){
            //do something
         } 
      }
   }
}

and so on.

I can't seem to figure out how I would be able to place the if loop in the last for loop and how I can access the variables of previous for loops from the if statement. I know that the question of variable nested loops has been asked alot of times, and I have looked through all of them. But none seem to help me.

Could someone present an easy way of using recursion to achieve this, keeping in mind that I'm still a beginner in c++, to point me in the right direction?

The use case is as follows:

Write a program to input the number of dice m. The program will output the total number of possible cases, the number of possible cases for each possible n and the n with the highest probability. Note: only one input m is read in. n is computed by the program

Example if user enters m=2 then program should output

The total number of possible cases is 36.
The possibilities are
2 1
3 2
4 3
.
.
.
12 1


Solution

  • Here's an example in plain old C++. First I make a vector of the ranges for each dimension called maxes. if the sum of all indices are 2 then I print did something. In the example I loop z from 0 to 1, y from 0 to 2, x from 0 to 3

    You can for sure make this more neat.

    Here goes:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int f(){ 
        return 2 ;
    }
    
    void inner(int depth,vector<int> & numbers,vector<int> & maxes){
      if (depth>0){
         for(int i=0;i<maxes[depth-1];i++){
            numbers[depth-1]=i;
            inner(depth-1, numbers,maxes) ;
         }
      }else{
         // calculate sum of x,y,z:
         cout << "values are ";
         for(int i=0;i<numbers.size();i++){
            cout <<numbers[i]<<" ";
         }
         int thesum(0);
         for(int i=0;i<numbers.size();i++){
            thesum+=numbers[i];
         }
         if (thesum==f()){
            cout << "did something! ";
         }
         cout<<endl;
       }
    }
    
    void donest(){
       vector<int>  numbers;
       numbers.resize(3);
       vector<int>  maxes;
       maxes.push_back(4);
       maxes.push_back(3);
       maxes.push_back(2);
       inner(numbers.size(),numbers,maxes);
    }
    
    int main(){
       donest();
    }
    

    result:

    values are 0 0 0 
    values are 1 0 0 
    values are 2 0 0  did something! 
    values are 3 0 0 
    values are 0 1 0 
    values are 1 1 0  did something! 
    values are 2 1 0 
    values are 3 1 0 
    values are 0 2 0  did something! 
    values are 1 2 0 
    values are 2 2 0 
    values are 3 2 0 
    values are 0 0 1 
    values are 1 0 1  did something! 
    values are 2 0 1 
    values are 3 0 1 
    values are 0 1 1  did something! 
    values are 1 1 1 
    values are 2 1 1 
    values are 3 1 1 
    values are 0 2 1 
    values are 1 2 1 
    values are 2 2 1 
    values are 3 2 1