c++ : dynamic number of nested for loops (without recursion)

后端 未结 3 732
野趣味
野趣味 2020-12-08 11:56

I\'m writing a code segment that iterates through every permutation of n digits. So for example, if n = 3, I would want to iterate through each of the following elements:

3条回答
  •  臣服心动
    2020-12-08 12:16

    If you want to simulate nested loops with a single one without using recursion, you can do so by maintaining a set of states (or slots) for each looping variable, which can be easily done with an array. Looping then turns into a simple matter of "adding 1" to that array, performing the carry operations as needed. If your nesting depth is n, and your maximum boundary for each loop is b, then the runtime of this is O(b^n), because the carry operations will only cost you at most O(b^n) (I'll skip the algebra here).

    Here is the working C++ code (updated to integrate Drew's comment):

    void IterativeNestedLoop(int depth, int max)
    {
        // Initialize the slots to hold the current iteration value for each depth
        int* slots = (int*)alloca(sizeof(int) * depth);
        for (int i = 0; i < depth; i++)
        {
            slots[i] = 0;
        }
    
        int index = 0;
        while (true)
        {
            // TODO: Your inner loop code goes here. You can inspect the values in slots
    
            // Increment
            slots[0]++;
    
            // Carry
            while (slots[index] == max)
            {
                // Overflow, we're done
                if (index == depth - 1)
                {
                    return;
                }
    
                slots[index++] = 0;
                slots[index]++;
            }
    
            index = 0;
        }
    }
    

提交回复
热议问题