![]() |
Re: "ABCD" in allen möglichen Kombinationen
|
Re: "ABCD" in allen möglichen Kombinationen
Hallo,
also mir ist das Prinzip von dino noch immer nicht klar. A B C D A B D C A C B D <--- wieso ? Wieso nicht A D B C ? also mir ist der Mechanismus noch nicht klar, wie man man denn beim Vertauschen vor geht. Man kann doch nicht einfach willkürlich tauschen. Es müsste ja eig. immer schrittweise gehen - rekursiv eben. |
Re: "ABCD" in allen möglichen Kombinationen
Zitat:
weil ich von links nach recht immer den kleinstmöglichsten Buchstaben nehme, dessen Kombination nch nicht vorgekommen ist :) |
Re: "ABCD" in allen möglichen Kombinationen
Also, ich habe eine Liste, die ich in allen möglichen Kombinationen zusammenstellen will.
Na denn:
Code:
Das ist übrigens schon fast die fertige rekursive Routine. Wenn Du das verstanden hast, kannst du es auch implementieren.
Erzeuge alle Permutationen (Liste L, bisherige Lösung)
Für jedes Element E in der Liste L Wenn E noch nicht in der bisherigen Lösung enthalten ist, dann Wenn E das letzte noch nicht verwendete Element der Liste ist, dann Ist [Lösung + E] eine Permutation ansonsten Erzeuge alle Permutationen (L, Lösung + E) |
Re: "ABCD" in allen möglichen Kombinationen
Hab heute den Vater meiner Freundinn auch nochmal gefragt, wie man denn sowas anpackt. Und er hat es mir auch so erklärt, wie Dino es angesprochen hat.
Nur hab ich es bei ihm besser verstanden. Warscheinlich weil eien direkte Konversation mehr bringt als was geschriebenes. Nichst gegen euch =) Ich danke euch für eure mühen. Ihr werden in den nächsten Postings dann meien Programmieransätze sehen ! :) mit freundlichen Grüßen |
Re: "ABCD" in allen möglichen Kombinationen
Liste der Anhänge anzeigen (Anzahl: 1)
Das hat mir jetzt keine Ruhe gelassen :stupid:
Hier mein Quellcode:
Delphi-Quellcode:
Das Wort kann aus bis zu 255 Zeichen bestehen. Ich hab allerdings noch nicht berücksichtigt, dass Buchstaben auch mehrfach vorkommen können.
function TForm1.Factorial(const x: Byte): Word;
begin if x > 1 then result := x * Factorial(x - 1) else result := x; end; procedure TForm1.CalcNextS(var s: string; const Initial: string); var l: Byte; // Position linker Austauschpartner r: Byte; // Position rechter Austauschpartner i: Byte; // Laufvariable Done: Boolean; // für Bubblesort Temp: Char; begin // linken Austauschpartner finden l := Length(s); repeat Dec(l); until Pos(s[l], Initial) < Pos(s[l+1], Initial); // rechten Austauschpartner finden r := l + 1; for i := l to Length(s) do if (Pos(s[i], Initial) > Pos(s[l], Initial)) and (Pos(s[i], Initial) < Pos(s[r], Initial)) then r := i; // austauschen Temp := s[l]; s[l] := s[r]; s[r] := Temp; // rechts von l der Größe nach sortieren if l <> Length(s) - 1 then repeat Done := True; for i := l+1 to Length(s) - 1 do if Pos(s[i], Initial) > Pos(s[i+1], Initial) then begin Temp := s[i]; s[i] := s[i+1]; s[i+1] := Temp; Done := False; end; until Done; end; procedure TForm1.Button1Click(Sender: TObject); var i: Integer; s: string; begin ListBox1.Clear; s := Edit1.Text; ListBox1.Items.Add(s); for i := 2 to Factorial(Length(s)) do begin CalcNextS(s, Edit1.Text); ListBox1.Items.Add(s); end; end; Die .exe ist im Anhang |
Re: "ABCD" in allen möglichen Kombinationen
Zitat:
Dass Zeichen sich wiederholen können, hab ich jetzt auch gelöst: Bevor nach Kombinationen gesucht wird, werden die Zeichen sortiert. Pro Zeichen, welches x-mal hintereinander vorkommt, wird die Anzahl der Kombinationen dann durch x! geteilt. |
Re: "ABCD" in allen möglichen Kombinationen
Genaugenommen kann ein String theoretisch bis zu 2 (oder warens 4) GiB groß sein.
|
Re: "ABCD" in allen möglichen Kombinationen
Liste der Anhänge anzeigen (Anzahl: 1)
meins ist zwar nur für 7 Zeichen, aber ungefähr gleich schnell
|
Re: "ABCD" in allen möglichen Kombinationen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz