Ver Mensaje Individual
  #19  
Antiguo 22-06-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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);

  {
    Si sólo se requiere un espacio, la lista de combinaciones coincide con la
    lista de símbolos.
  }
  if Espacios = 1 then
    for I := Low(Simbolos) to High(Simbolos) do
      Lista.Add(Simbolos[i])
  else
  {
    En caso contrario, colocamos en una lista temporal las combinaciones con
    un elemento menos, e iteramos sobre los símbolos anexando cada uno a la
    lista temporal.
  }
  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
    {
      El número de espacios (4 en el ejemplo) puede leerse del usuario.
    }
    Combinaciones(['a','b','c','d','1','2','3', '#'], 4, Lista);
    Memo1.Lines.AddStrings(Lista);
  finally
    Lista.Free;
  end;
end;

// Saludos
Responder Con Cita