You could, for example, create a vector containing all the index IDs, so each in each recurse you add the index to the list before calling the recursive function then remove it from the list after.
However, it's probably a better idea to forgo the recursion idea here and instead just look at all the permutations using an iterative technique. Here's an arbitrary proof of concept, which should give you some ideas:
#include <stdio.h>
const unsigned int dimensions = 3;
const unsigned int dimension_size[dimensions] = { 2, 4, 3 };
// Get first permutation.
inline void get_first_permutation( unsigned int * const permutation )
{
for ( int i = 0; i < dimensions; ++i )
permutation[i] = 0;
}
// Returns false when there are no more permutations.
inline bool next_permutation( unsigned int * const permutation )
{
int on_index = dimensions - 1;
while ( on_index >= 0 )
{
if ( permutation[on_index] >= dimension_size[on_index] )
{
permutation[on_index] = 0;
--on_index;
}
else
{
++permutation[on_index];
return true;
}
}
return false;
}
// Print out a permutation.
void print_permutation( const unsigned int * const permutation )
{
printf( "[" );
for ( int i = 0; i < dimensions; ++i )
printf( "%4d", permutation[i] );
printf( "]\n" );
}
int main( int argc, char ** argv )
{
// Get first permutation.
unsigned int permutation[dimensions];
get_first_permutation( permutation );
// Print all permutations.
bool more_permutations = true;
while ( more_permutations )
{
print_permutation( permutation );
more_permutations = next_permutation( permutation );
}
return 0;
}
This is, of course, assuming you actually need to know the indices. If you're just trying to update all the counters you can just loop from index 0 to index dim_0*dim_1*...*dim_n
/* Defined somewhere. Don't know how this gets allocated but what-evs. :) */
unsigned int dimensions = 5;
unsigned int dimension_length = { 1, 2, 4, 7, 6 };
int * int_array = ...
/* Your loop code. */
unsigned int array_length = 0;
for ( unsigned int d = 0; d < dimensions; ++d )
array_length += dimension_length[d];
int *array_pointer = int_array;
for ( unsigned int i = 0; i < array_length; ++i, ++array_pointer )
array_pointer = counter++;