Questo è un mio programma completo che fa quello che vuoi tu:
(non è ricorsivo)
La funzione + importante è disp()
codice:
#include <iostream>
#include <string>
// per system("PAUSE") e exit()
#include <cstdlib>

using namespace std;

void disp();
void init();
void show();
void filltable();

int tot_chars;
int *vals;
string parola;

int main()
{
    // Spiege come formattare l'input
	cout << "Inserisci una parola che contenga tutte le lettere da utilizzare e premi invio." << endl;
	cout << "Scrivi 'alfa' se vui tutto l'alfabeto minuscolo." << endl;
	cout << "Scrivi 'ALFA' se vui tutto l'alfabeto maiuscolo." << endl;
	cout << "Scrivi 'Alfa' se vui tutto l'alfabeto minuscolo e maiuscolo." << endl;
	cout << "Permi solo invio per le cifre da 0 a 9." << endl;
	// 40 caratteri dovrebbero bastare a fondere qualsiasi computer
	char buf[40];
	// Qui chiede l'input con getline()
 	cin.getline(buf,40); parola = buf;
 	// Riempie la tabella dei caratteri (se ad esempio ha messo "Alfa"
	filltable();
	cout << "Quanto sarà lunga ogni combinazione?" << endl;
	do {
	    cin >> tot_chars;
	} while(tot_chars <= 0);    
	// Crea l'array delle combinazioni
	vals = new int[tot_chars];
	if(!vals)
	{
		cout << "Memoria insufficiente!!!"<<endl;
		system("PAUSE");
		exit(1);
	}
	// Inizializza con il primo valore
	init();
	// Mostra tutte le combinazioni
	disp();
	// Cancella l'array delle combinazioni
	delete [] vals;
	cout << "Grazie e arrivederci." << endl;
	system("PAUSE");
	return 0;
}

void filltable()
{
	int i;
	if(parola == "alfa")
	{
	    parola = "";
		// Riempie la tabella con lettere da 'a' a 'z'
		for(i='a'; i<='z'; i++)
			parola += i;
	}			
	else if(parola == "ALFA")
	{
	    parola = "";
		// Riempie la tabella con lettere da 'A' a 'Z'
		for(i='A'; i<='Z'; i++)
			parola += i;
	}	
	else if(parola == "Alfa")
	{
	    parola = "";
		// Riempie la tabella con lettere da 'a' a 'z'
		for(i='a'; i<='z'; i++)
			parola += i;
		// Riempie la tabella con lettere da 'A' a 'Z'
		for(i='A'; i<='Z'; i++)
			parola += i;
	}
	else if(parola.size() == 0)
	{
	    parola = "";
		// Riempie la tabella con cifre da '0' a '9'
		for(i='0'; i<='9'; i++)
			parola += i;
	}
}

void disp()
{
	int last = tot_chars - 1;
	int pos = last;
	bool end_flag;

	// Mostra la combinazione attuale (tutti zeri)
	show();
	for(end_flag = false; !end_flag; )
	{
		// Incrementa il valore alla posizione corrente
		vals[pos]++;
		// Mostra la combinazione attuale
		show();
		// Torna alla prima posizione.
		pos = last;
		// Vado avanti finchè non trovo un valore che non sia l'ultimo
		while (vals[pos]==(parola.size()-1))
		{
			// Imposto la posizione corrente a 0
			vals[pos] = 0;
			// precedente
			pos--;
			// Se sono arrivato prima dell'inizio del vettore, 
			// cioè anche il primo carattere era un valore finale (come 9)
			// allora ho finito.
			if(pos < 0) end_flag = true;
		}

	}
}

void show()
{
	for(int i=0; i<tot_chars; i++)
	{
		cout << parola[vals[i]];
	}
	cout << endl;
}

void init()
{
    for(int i=0; i<tot_chars; i++)
    	vals[i] = 0;	

}
Se trovi bug avvisami!