Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Türme von Hanoi, richtiger Algorythmus? (https://www.delphipraxis.net/82724-tuerme-von-hanoi-richtiger-algorythmus.html)

condor 18. Dez 2006 20:22


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;

RavenIV 19. Dez 2006 08:35

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...

Phoenix 19. Dez 2006 08:49

Re: Türme von Hanoi, richtiger Algorythmus?
 
Schonmal hier nach Hier im Forum suchenHanoi gesucht?
Offenbar nicht, sonst hättest Du Matze's Beispielcode in der OpenSource Sparte gefunden...

SeriousToni 1. Feb 2007 19:41

Re: Türme von Hanoi, richtiger Algorythmus?
 
Ich habe eine etwas andere Variante gefunden:
Code:
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.
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:

sirius 1. Feb 2007 20:31

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