Hola ruina.
Me parece que el algoritmo propuesto no da realmente todas las combinaciones... he hecho de manera rápida una función que, valiendose de la recursividad, promete dar todas las combinaciones posibles de un array de caracteres, en un string de una longitud determinada.
Código Delphi
[-]
Procedure CombinaArray(cars : Array of char; longitud : Integer; resultado : TStrings);
Procedure Combinacion(const prefijo : String; NivelesPendientes : Integer);
Var
i : Integer;
res : String;
Begin
for i := low(cars) to high(cars) do
begin
res := prefijo + Cars[i];
if NivelesPendientes > 0 Then
Combinacion(res, NivelesPendientes - 1)
else
resultado.Add(res);
end;
end;
begin
combinacion('', longitud - 1);
end;
La forma de uso sería algo como:
Código Delphi
[-]
Memo1.Lines.Clear;
memo1.Lines.BeginUpdate;
CombinaArray(['a', 'b', 'c', 'd', 'e', 'f'], 5, memo1.Lines);
Memo1.Lines.EndUpdate;
Hasta luego.