Das ist mir natürlich peinlich, einfach so ungetesteten Code hier zu posten. Mein Zusatz mit 'NThPermuation', das übrigens alle Permutationen einer Zeichenkette bildet, hätte so lauten müssen:
Delphi-Quellcode:
if k=0 Then
For j:=1 to Fakultaet(Length (q)) do
Form1.memo1.Lines.Add(NThPermutation (q,j)) // Teilmenge gefunden, irgendwo muss sie ja hin
Dann werden von jeder Kombination alle Permutationen gebildet. Natürlich ist die ständige Berechnung von 'Length(q)' blödsinnig, aber das würde man auch noch hinbekommen.
Es geht aber noch einfacher:
Delphi-Quellcode:
Type
TByteSet = Set Of Byte;
Procedure Variation (Const s,q : String; k,n : Integer; B : TByteSet);
Var
j : Integer;
Begin
if k=0 Then
Form1.memo1.Lines.Add(q) // Teilmenge gefunden, irgendwo muss sie ja hin
else
For j:=1 to n do
if not (j in B) then
Variation (s, q + s[j], k - 1, n, B + [j])
End;
begin
Variation ('123','',2,3,[]); // Alle 2-Tupel der Menge '123' (mit 3 Elementen)
end;
Statt nur die restlichen Elemente von S zu verwenden, nimmt man bei der Variation einfach alle bisher nicht verwendeten. Dazu verwende ich ein TByteset, das die bisher verwendeten Elemente (bzw. deren Position in S) speichert.
Anmerkung: Und wenn man n=k setzt, bekommt eine weitere Variation
für Code, der alle Permutationen bildet.