Si tenemos tres letras (a,b,c), las combinaciones con dos elementos serían:
Código:
aa
ab
ac
ba
bb
bc
ca
cb
cc
Si ahora queremos las combinaciones con tres elementos, basta tomar las anteriores y anexarles la a,
Código:
aaa
aab
aac
aba
abb
abc
aca
acb
acc
luego la b
Código:
baa
bab
bac
bba
bbb
bbc
bca
bcb
bcc
y finalmente la c
Código:
caa
cab
cac
cba
cbb
cbc
cca
ccb
ccc
Esto es,
una vez que tenemos las combinaciones con N elementos, podemos, a partir de ellas, formar las de N+1 elementos, anexándoles cada uno de los distintos símbolos.
Todo esto lo digo, porque se puede hacer un procedimiento recursivo para evitar el número variable de índices.
Un ejemplo:
Código Delphi
[-]
procedure Combinaciones(Simbolos: array of Char; Espacios: Integer; Lista: TStrings);
var
ListaTemp: TStringList;
I, J: Integer;
begin
Assert(Espacios > 0);
if Espacios = 1 then
for I := Low(Simbolos) to High(Simbolos) do
Lista.Add(Simbolos[i])
else
begin
ListaTemp := TStringList.Create;
try
Combinaciones(Simbolos, Espacios - 1, ListaTemp);
for I := Low(Simbolos) to High(Simbolos) do
for J := 0 to ListaTemp.Count -1 do
Lista.Add(Simbolos[i] + ListaTemp[J]);
finally
ListaTemp.Free;
end;
end;
end;
Al procedimiento Combinaciones le pasas la lista de símbolos o letras que desees, así como el número de elementos que quieras poner. El procedimeitno colocará en el tercer parámetro todas las combinaciones. Un ejemplo de uso:
Código Delphi
[-]
procedure TForm1.Button1Click(Sender: TObject);
var
Lista: TStringList;
begin
Lista := TStringList.Create;
try
Combinaciones(['a','b','c','d','1','2','3', '#'], 4, Lista);
Memo1.Lines.AddStrings(Lista);
finally
Lista.Free;
end;
end;
// Saludos