| |
|
|
p.specht
| Wußtet Ihr, daß die 'Türme von Hanoi' eigentlich aus Frankreich stammen?
WindowTitle upper$("Türme von Hanoi, rekursiv")
WindowStyle 24:Window 0,0-%maxx,240:randomize:font 2
print "\n Hinweis: Sind n Scheiben auf 3 Pfosten vorgegeben, so braucht man mindestens 2^n-1 Schritte."
print "\n Das Problem ist in dieser Aufbereitung beliebt, um den Unterschied zwischen einer "
print " rekursiven Darstellung [(x(1)=1 und x(n+1)=2*x(n)+1] und expliziter Darstellung [x(n)=2^n-1]"
print " einer Folge zu demonstrieren."
waitinput 5000
Print "\n Zur Geschichte der Problemstellung:\n"
Print " Der französische Mathematiker Édouard Lucas (1842-1891) erfand dieses Spiel "
Print " und verkaufte es als Spielzeug erstmals im Jahre 1883. Dazu dachte sich Lucas "
print " eine Geschichte aus: Hindupriester sollten auf Geheiß ihres Gottes Brahma "
print " 64 Scheiben umlegen. Dazu benötigten sie theoretisch mindestens 2^64-1 = "
print " 1.8*10 ^19 Züge. Wird in jeder Sekunde eine Scheibe umgelegt, so dauert das "
print " 580 Milliarden Jahre. Das Weltall ist derzeit 13,48 Mrd Jahre alt und wird "
print " den beschleunigten Expansionstod (Atome zerreissen kausal) presumibilmente in ca."
print " 48 Mrd Jahren erleiden. Nehmen wir also vielleicht etwas weniger Scheiben...\n"
waitinput 5000
print " \n Eine nonrekursive Algorithmus-Variante scheint *per Menschen* überraschend einfach:\n"
print " Solange der Turm nicht vollständig bewegt wurde: "
print " - bewege die kleinste Scheibe einen Platz modulo 3 nach rechts *)"
print " - führe die einzig mögliche Bewegung einer nicht-kleinsten Scheibe aus.\n____\n"
print " *): Scheibenzahl ungerade? Ersetze 'rechts' durch 'links' \n"
print "\n Hier folgt aber eine rekursive Variante, um damit XProfan auszutesten."
declare n&,m&
print "\n\n\n Gewünschte Scheibenzahl ?:",:input n&
WindowTitle " TASTE Q per SCHNELL-LAUF DRÜCKEN "
cls
declare h&[3,n&],v&[3],z&
whileloop n& : h&[1,&Loop]=n&+1-&Loop : endwhile :
v&[1]=n&
m&=n&
show 1,2
waitinput 1000
hanoi(n&,1,2,3)
beep
waitinput
end
proc hanoi :parameters n&,von&,nach&,ueber&
if n&=1
move(von&,nach&)
elseif n&>1
hanoi(n&-1,von&,ueber&,nach&)
move(von&,nach&)
hanoi(n&-1,ueber&,nach&,von&)
endif
endproc
proc move :parameters von&,nach&
v&[nach&]=v&[nach&]+1
h&[nach&,v&[nach&]]=h&[von&,v&[von&]]
h&[von&,v&[von&]]=0:v&[von&]=v&[von&]-1
show von&,nach&
case %key<>113:waitinput 1000
endproc
proc Show :parameters von&,nach&
locate 1,1
inc z&
print " ";z&;":",von&;">";nach&;" "
print "------------------------"
case %key<>113:waitinput 1000
declare v&,w&
whileloop 1,3:v&=&Loop
print " ";v&;": ",
whileloop 1,m&
w&=&Loop
if h&[v&,w&]>0:print h&[v&,w&],
else :print ".",
endif
endwhile
print
endwhile
print "------------------------"
endproc
|
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 16.05.2021 ▲ |
|
|
|