![]() |
Türme von Hanoi, richtiger Algorythmus?
Hi, ich habe die Türme von Hanoi schon fast fertig. Die Bewegung an sich dürfte auch nicht schwer fallen, aber ich hätte da eine Frahe zum Algorythmus:
Was ist an dem falsch? Wenn ich ihn ausführe, dann wird jedes Mal die oberste Scheibe bewegt und mehr nicht.
Delphi-Quellcode:
procedure TForm1.umsetzen(anzahl, von, nach, hilf : integer);
var lauf: integer; s: string; begin Application.ProcessMessages; if aborted=1 then exit; s:=''; for lauf:=0 to 0+anzahl do s:=s+' '; memo1.Lines.add(s+'umsetzen('+inttostr(anzahl)+','+ inttostr(von)+','+inttostr(nach)+','+ inttostr(hilf)+')'); if anzahl=1 then setze_eine(von,nach) else begin umsetzen(anzahl-1,von,hilf,nach); umsetzen(1,von,nach,hilf); umsetzen(anzahl-1,hilf,nach,von); end; end; procedure TForm1.setze_eine(von,nach : integer); var jetzt:integer; begin inc(versuch); progressbar1.position:=versuch+1; tturmx[nach].steine[spinedit1.Value-1]:=tturmx[von].steine[spinedit1.Value-1]; tturmx[nach].steine[spinedit1.Value-1].Parent:=tturmx[nach]; memo2.Lines.add(inttostr(versuch)+ ': '+inttostr(von)+' -> '+inttostr(nach)); Jetzt := GetTickCount + SpinEdit2.value; REPEAT Application.ProcessMessages; UNTIL GetTickCount > Jetzt; end; |
Re: Türme von Hanoi, richtiger Algorythmus?
Bemühe doch mal den Herrn Google.
Der Findet sicher eine Million Einträge zu diesem Thema. Und es gibt sicher auch Musterlösungen... |
Re: Türme von Hanoi, richtiger Algorythmus?
Schonmal hier nach
![]() Offenbar nicht, sonst hättest Du Matze's Beispielcode in der OpenSource Sparte gefunden... |
Re: Türme von Hanoi, richtiger Algorythmus?
Ich habe eine etwas andere Variante gefunden:
Code:
Ich sitze jetzt schon andert halb Stunden hier und versuche nachzuvollziehen, wie das Programm diese Procedur abarbeitet und wie sich die Variablen bei jedem Durchlauf ändern, aber ich bekomme es nicht raus. :wall: Erklärt sich vielleicht jemand bereit hier mit diesem Code einen kleinen Durchlauf mit mir zu machen? Das Programm funktioniert aber ich kann nicht nachvollziehen wie? :pale:
procedure Hanoi(n,nr:integer; von,nach,uber:char; ausgabe:string);
begin nr:=n; if n>0 then begin Hanoi(n-1,nr,von,uber,nach,ausgabe); ausgabe:='Verschiebe Scheibe '+inttostr(nr)+' von '+von+' nach '+nach; form1.listbox1.Items.add(ausgabe); Hanoi(n-1,nr,uber,nach,von,ausgabe); nr:=nr-1; end; end; procedure TForm1.Button1Click(Sender: TObject); var anz,num:integer;ausg:string; begin anz:=strtoint(form1.Edit1.Text); Hanoi(anz,num,'A','C','B',ausg); form1.Label4.Caption:=inttostr(form1.ListBox1.Count); end; end. |
Re: Türme von Hanoi, richtiger Algorythmus?
Liste der Anhänge anzeigen (Anzahl: 1)
Alte Erinnerungen werden wach... :feuerchen:
Damals, als es noch (fast) kein Internet gab, hat ich mir den algorithmus selber aus den Fingern gesogen und meine Info-Lehrer überrascht :dancer: Also, das ganze ist rekursiv und geht so: Der Usprungsauftrag lautet für insgesamt 5 Scheiben : >>Verschiebe 5 Scheiben von A nach C (über B) Was macht nun diese Funktion Verschiebe: [1. Funktionsaufruf / 1.rekursive Instanz] Sie sagt sich: "Das geht doch ganz einfach" und macht folgendes: >>jemand muss erstmal die oberen 4 Scheiben nach B [das "über"] verschieben >>dann verschiebe ich 1 Scheibe von A nach C >>dann muss der jemand die 4 Scheiben noch von B nach C schieben Und wer verschiebt die 4 Scheiben? Na die eigene Funktion ein zweites mal (aus sich sebst heraus) aufgerufen [2. rekursive Instanz]: Und die hat natürlich den selben Befehlssatz, nur die Eingangsparameter lauten jetzt: Verschiebe 4 Scheiben von A nach B >>also die oberen 3 Scheiben erstmal von A nach C >>eine Scheibe von A nach B >>die 3 beiseite gelegten Scheiben von C nach B usw. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09: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 by Thomas Breitkreuz