Hi,
Ich habe aus Eigenbedarf eine kurze Funktion geschrieben, um Permutationen zu erzeugen.
Also eigentlich sind es zwei: bei der einen einen sind die Elemente Chars, bei der anderen Strings.
Beispiel:
will man aus 123 die Werte 123,132,213,231,... machen, so ist Funktion 1 richtig
möchte man dagegen aus AB,CD,EF die Werte AB,CD,EF; AB,EF,CD; CD,AB,EF; CD,EF,AB;... machen, so ist Funktion 2 richtig...
Die einzige Methode die ich bisher gesehn hab für die zweite ist von Hagen in der CodeLib...mit Sicherheit deutlich schneller
aber erstens glaube ich, das für viele eine StringList deutlich einfacher zu handhaben ist, und zum zweiten ist mein Quellcode deutlich kürzer und daher für viele etwas besser verständlich
Die Erste nimmt als Parameter einen String mit den Werten, und gibt eine StringList zurück.
Delphi-Quellcode:
type
TSL = TStringList;
TSLArr = array of TSL;
procedure Permute(var Lst: TStringList; const Vals: string; const Akt: string);
var
i: Integer;
S: string;
begin
if Length(Vals) = 0 then
Lst.Add(Akt) //Permutation fertig
else
for i := 1 to Length(Vals) do
begin
S := Vals;
Delete(S, i, 1);
Permute(Lst, S, Akt + Vals[i]);
end;
end;
Die Zweite nimmt als Parameter eine StringList mit den Werten, und gibt einen Array of TStringList zurück.
Delphi-Quellcode:
procedure PermuteExt(var Lst: TSLArr; const Vals: TSL; const Akt: TSL);
var
i: Integer;
V, A: TSL;
begin
if Vals.Count = 0 then
begin
SetLength(Lst, Length(Lst) + 1);
Lst[Length(Lst) - 1] := TStringList.Create;
Lst[Length(Lst) - 1].AddStrings(Akt);
end
else
begin
V := TSL.Create;
A := TSL.Create;
for i := 0 to Vals.Count - 1 do
begin
A.Clear;
A.AddStrings(Akt);
A.Add(Vals[i]);
V.Clear;
V.AddStrings(Vals);
V.Delete(i);
PermuteExt(Lst, V, A);
end;
V.Free;
A.Free;
end;
end;
prinzipiell genau das selbe Raster....
ein Beispiel-Projekt gibt es auch noch dazu (nicht beschweren, Halt mal so schnell gemacht
)
[edit=Matze]Code formatiert. Mfg, Matze[/edit]