void recurse(int n, int m, char* stack, filled = 0) { // filled denotes how many elements of our stack are filled [ with valid data ] if (filled == 0) { // initiallize our base cases, 0 though (n - m) // - no point in setting anything higher than n-m because it will be pruned for (int x = 0; x < n - m; ++x) { stack[0] = 'a' + x; // 'b' = 'a' + 1, 'c' = 'a' + 2, etc. recurse(n, m, stack, filled + 1); } return; } if (filled == m) { // if our stack is full, display it display(stack, m); return } // stack[filled - 1] was the last char we put in. // extract that number (as element of n) by subtracting 'a' // starting at the next element, iterate up as far to n as will still allow us to fill // any unfilled elements of the stack (m - filled), thus, n - (m - filled) for (int x = (int)(stack[filled - 1] - 'a') + 1; x < n - (m - filled); ++x) { stack[filled] = 'a' + x; recurse(n, m, stack, filled + 1); } return; } stack = new char[3]; recurse(5, 3, stack)