![]() |
1,2,3,4,5,6 - Reihenfolgen
Hallo 8)
Weiß jemand vielleicht die Routine die mir alle Reihenfolgen z.B. für 6 Elemente ausgiebt: 1, 2, 3, 4, 5, 6 1, 2, 3, 4, 6, 5 1, 2, 3, 5, 4, 6 1, 2, 3, 5, 6, 4 1, 2, 3, 6, 4, 5 usw... mfg Paul Jr. |
Re: 1,2,3,4,5,6 - Reihenfolgen
|
Re: 1,2,3,4,5,6 - Reihenfolgen
Hallo Toms 8) ,
Ich glaube nicht, dass das richtiges Beispiel für mich ist... aus n-Elemente sollten auch n-Elemente gebieldet werden... (also aus 6 alle möglichen 6-Reihenfolgen) oder habe ich es nicht verstanden? mfg Paul Jr. |
Re: 1,2,3,4,5,6 - Reihenfolgen
Hallo Paul Jr.
auf ![]() |
Re: 1,2,3,4,5,6 - Reihenfolgen
Oki... Danke 8) Master...
Gruß Paul Jr. |
Re: 1,2,3,4,5,6 - Reihenfolgen
Leider die Lösung meines Problem ist dort nicht auffindbar.
P(n,r) = n! / (n-r)! ist für mich ungeeignet da bei n = 6 und r = 6 müsste sich die Teilung durch 0 ergeben mfg Paul Jr. |
Re: 1,2,3,4,5,6 - Reihenfolgen
Zitat:
wenn also n=6 und r=6 ist das
Code:
P(6,6) = 6! / (6-6)!
= 6! / (0)! = 720 / 1 = 720 |
Re: 1,2,3,4,5,6 - Reihenfolgen
Danke Sharky 8) ,
meine Abitur liegt schon sehr lange, lange her... Peinlich, peinlich :oops: Gruß´ Paul Jr. |
Re: 1,2,3,4,5,6 - Reihenfolgen
Hallo 8)
Wüsste jemand aber den Delphi- Algorithmus wo ich nicht Strings sonder Zahlen als Ausgabe bekommen würde? Gruß Paul Jr. |
Re: 1,2,3,4,5,6 - Reihenfolgen
Zitat:
|
Re: 1,2,3,4,5,6 - Reihenfolgen
Hallo Sharky,
das geht leider nicht... sonnst würde meine Anwendung zu lange laufen... und im Übrigem muss die sehr flexibel sein... also mit angaben von Zahlen... Gruß Paul Jr. |
Re: 1,2,3,4,5,6 - Reihenfolgen
Hallo PaulJr,
wenn du bis heute Abend warten kannst, kann ich dir eine Musterlösung in Pascal zuschicken. Gruß danielA |
Re: 1,2,3,4,5,6 - Reihenfolgen
Daniel hervorragend!!! :D
Ich wäre Dir SEHR dankbar! Vielleicht könntest Du die Ausgabe ganz einfach in ein Listbox (z.B.: ListBox1) umleiten...aber es muss nicht sein... Gruß und vielen, vielen Dank 8) Paul Jr. |
Re: 1,2,3,4,5,6 - Reihenfolgen
Hallo PaulJr,
ich stelle folgenden Code mal so in den Raum. der Quellcode ist nicht kommentiert, ich bitte um Nachsicht, habe meinen Anschiß dafür auch bekommen :evil: .
Delphi-Quellcode:
er arbeitet aber ebenfalls mit Strings. Die Elemente sind durch das Dezimalsystem vorgegeben sonst funzt die Rekursion in Permute nicht. Ich weiß nun nicht ob du damit was anfangen kannst, oder was du damit vorhast. Aber bedenke, Permute(10) erzeugt bereits 3628800 Permutationen und dauert dementsprechend. Das war mal einen Hausaufgabe an der UNI Die versprochene Musterlösung ist in MODULA2 geschrieben, müßte ich also erst übersetzen. Sie arbeitet aber nach dem selben Prinzip, allerdings mit einem festen Array.Ist also unkomfortabler.
vunit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type PermuteList = ^OpenArr; OpenArr = Record Elem : String; Next : PermuteList; end; TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; ListBox1: TListBox; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } Function Permute(N: Integer):PermuteList; Procedure DeleteList(Liste: PermuteList); end; var Form1: TForm1; implementation {$R *.dfm} Procedure TForm1.DeleteList(Liste: PermuteList); var HilfsZeiger: PermuteList; begin if Liste<>nil then begin HilfsZeiger:=Liste; while HilfsZeiger^.Next<>Nil do begin Liste:=HilfsZeiger^.Next; HilfsZeiger^.Next:=nil; dispose(HilfsZeiger); HilfsZeiger:=Liste; end; Liste:=nil; dispose(Hilfszeiger); HilfsZeiger:=nil; end; end; Function TForm1.Permute(N: Integer):PermuteList; Function GetElems(Wert : String;Start,Stop : integer):String; var Rueckgabe : string; begin Rueckgabe:=''; GetElems:=''; if (Start<=Stop) and (Start>0) then begin while (Start>1) and (Pos(',',Wert)>0) do begin Delete(Wert,1,Pos(',',Wert)); Dec(Start); Dec(Stop); end; if Start=1 then begin while (Stop>=1) and (Wert<>'') do begin if Pos(',',Wert)>0 then begin Rueckgabe:=Rueckgabe+','+Copy(Wert,1,Pos(',',Wert)-1); Delete(Wert,1,Pos(',',Wert)); Dec(Stop) end else begin Rueckgabe:=Rueckgabe+','+Wert; Wert:=''; Dec(Stop); end; end; end; end; Delete(Rueckgabe,1,1); GetElems:=Rueckgabe; end; Var I,K: integer; N_As_String,Element : String; OLD_InternList, OLD_LaufList : PermuteList; NEW_InternList, NEW_LaufList : PermuteList; begin Permute:=Nil; New_InternList:=Nil; IF N<=2 then begin If N=2 then begin new(New_InternList); NEW_InternList^.Elem:='1,2'; new(NEW_InternList^.Next); NEW_InternList^.Next^.Elem:='2,1'; NEW_InternList^.Next^.Next:=nil; Permute:=NEW_InternList; NEW_InternList:=Nil; end else if N=1 then begin new(NEW_InternList); NEW_InternList^.Elem:='1'; NEW_InternList^.Next:=Nil; Permute:=NEW_InternList; NEW_InternList:=Nil; end else begin Permute:=nil; end; end else begin STR(N,N_As_String); OLD_InternList:=Permute(N-1); If OLD_InternList<>Nil then begin OLD_LaufList:=OLD_InternList; while OLD_LaufList^.Next<>Nil do begin if NEW_InternList=Nil then begin new(NEW_InternList); NEW_InternList^.Elem:=N_As_String+','+OLD_LaufList^.Elem; OLD_LaufList:=OLD_LaufList^.Next; NEW_InternList^.next:=Nil; NEW_LaufList:=NEW_InternList; end else begin new(NEW_LaufList^.Next); New_LaufList:=New_LaufList^.Next; New_LaufList^.Elem:=N_As_String+','+OLD_LaufList^.Elem; OLD_LaufList:=OLD_LaufList^.Next; NEW_LaufList^.Next:=Nil; end; end; { fr letztes Element in Old_LaufList } if NEW_InternList=Nil then begin new(NEW_InternList); NEW_InternList^.Elem:=N_As_String+','+OLD_LaufList^.Elem; NEW_InternList^.next:=Nil; NEW_LaufList:=NEW_InternList; end else begin new(NEW_LaufList^.Next); New_LaufList:=New_LaufList^.Next; New_LaufList^.Next:=nil; New_LaufList^.Elem:=N_As_String+','+OLD_LaufList^.Elem; end; For I:=2 to N do begin OLD_LaufList:=OLD_InternList; while OLD_Lauflist^.Next<>Nil do begin new(New_LaufList^.Next); New_LaufList:=New_LaufList^.Next; New_LaufList^.Elem:=#13#10; New_LaufList^.Elem:=GetElems(OLD_Lauflist^.Elem,1,i-1)+','+N_As_STRING+','+GETElems(Old_Lauflist^.Elem,i,N); if Copy(New_LaufList^.Elem,1,1)=',' then Delete(New_LaufList^.Elem,1,1); if Copy(New_LaufList^.Elem,Length(New_LaufList^.Elem),1)=',' then Delete(New_LaufList^.Elem,Length(New_LaufList^.Elem),1); Old_Lauflist:=Old_LaufList^.Next; end; new(New_LaufList^.Next); New_LaufList:=New_LaufList^.Next; New_LaufList^.Elem:=GetElems(OLD_Lauflist^.Elem,1,i-1)+','+N_As_STRING+','+GETElems(Old_Lauflist^.Elem,i,N); if Copy(New_LaufList^.Elem,1,1)=',' then Delete(New_LaufList^.Elem,1,1); if Copy(New_LaufList^.Elem,Length(New_LaufList^.Elem),1)=',' then Delete(New_LaufList^.Elem,Length(New_LaufList^.Elem),1); end; NEW_LaufList^.Next:=nil; OLD_LaufList^.Next:=nil; Permute:=NEW_InternList; NEW_LaufList:=Nil; Old_LaufList:=Nil; DeleteList(Old_InternList); end; end; end; {Hauptprogramm} procedure TForm1.Button1Click(Sender: TObject); var AusgabeListe,LaufListe : PermuteList; i : integer; n : integer; begin ListBox1.Clear; AusgabeListe:=nil; n:=StrToInt(Edit1.Text); AusgabeListe:=Permute(n); i:=0; if Ausgabeliste<>nil then begin LaufListe:=AusgabeListe; while LaufListe^.Next<>nil do begin // Writeln('['+LaufListe^.Elem+']'); ListBox1.Items.Add(laufliste^.Elem); Laufliste:=LaufListe^.Next; inc(i); end; // writeln('['+LaufListe^.Elem+']'); ListBox1.Items.Add(laufliste^.Elem); inc(i); LaufListe:=nil; DeleteList(AusgabeListe); end; ShowMessage(inttostr(i) + ' Permutationen gefunden !!!'); end; end. Grüße aus Hamburg Daniel A |
Re: 1,2,3,4,5,6 - Reihenfolgen
Hallo Daniel :D
zuerst vielen, vielen für Deine Hilfe... TOLL!!! Ich werde es Morgen ausprobieren und mich noch einmal hier melden... Bin wirklich beeindruckt! Gruß und Danke Paul Jr. |
Re: 1,2,3,4,5,6 - Reihenfolgen
Hallo Daniel :lol: ,
wie schon gestern gesagt bin ich sehr beeindruckt... :shock: ... werde ich es heute ausprobieren und mich hier melden. Gruß Paul Jr. |
Re: 1,2,3,4,5,6 - Reihenfolgen
Hallo Daniel :D ,
also ich bin soweit... Es läuft hervorragend... Kompliment... genau das was ich gesucht habe!!! Herzliche Grüße Paul Jr. |
Re: 1,2,3,4,5,6 - Reihenfolgen
Hi
Hier mal meine Lösung
Delphi-Quellcode:
Sie ist ein bischen weniger aufwendig und arbeitet inplaced.
procedure Combi(const Value: String; List: TStrings);
procedure DoCombi(Pattern,Pos,Stop: PChar); // Erzeuge alle Kombinationen ohne Duplikate (Permutationen) aus Pattern von der // Zeichenposition Pos angefangen bis zur Zeichenposition Stop. // Pattern muß alpha. sortiert sein. // 'AABCDEEXYZ' ist korrekt, aber 'KABA..' ist falsch. // Pattern enthält nach Rückkehr von DoCombi() wieder die ursprüngliche // Sortierung, wird aber während der Rekursion modifiziert. // Die Kombinationen werden alpha. aufsteigend enumeriert. var Cur: PChar; Tmp,Last: Char; begin if Pos >= Stop then begin List.Add(Pattern); Exit; end; Last := #0; Cur := Pos; while Cur <= Stop do begin Tmp := Cur^; Cur^ := Pos^; Pos^ := Tmp; if Tmp > Last then // verhindere Duplikate ! // Falls alle Kombinationen, inklusive Duplikate enumeriert werden sollen // muß diese Abfrage entfernt werden. Die Restriktion der alpha. Sortierung // ist dann auch nicht mehr erforderlich. begin DoCombi(Pattern, Pos +1, Stop); Last := Tmp; end; Inc(Cur); end; Tmp := Pos^; while Pos < Stop do begin Pos^ := Pos[1]; Inc(Pos); end; Pos^ := Tmp; end; var Temp: String; begin Temp := Value; UniqueString(Temp); DoCombi(@Temp[1], @Temp[1], @Temp[Length(Temp)]); end; procedure Test; var List: TStringList; begin List := TStringList.Create; try Combi('123456', List); WriteLn(List.Text); finally List.Free; end; end; Oder hier ![]() Gruß Hagen |
Re: 1,2,3,4,5,6 - Reihenfolgen
Ups... :oops:
Hallo Hagen 8) , erst jetzt sehe ich, dass Du auch was aus Deiner Zauberkiste herausgezogen hast... Besten Dank :lol: Dies habe ich natürlich auch sofort in meine Unit integriert. Ich benutze aber weiter die Routine von Daniel... aber man weiß es nie... Also noch einmal Besten Dank an Euch beiden Profis... :coder: Gruß Paul Jr. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 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