Towers of Hanoi: Difference between revisions

From Rosetta Code
Content added Content deleted
mNo edit summary
Line 1: Line 1:
{{task}}
[http://yvharlen.at.tut.by/lib/anema-e.htm anema e core] [http://jrosestar.ifrance.com/html/pedrollo/ pedrollo] [http://macertot.ifrance.com/view/banca-di.htm banca di desio] [http://beyonddreamingx.angelfire.com/content/koyuncu.htm koyuncu] [http://ariadnafeni.ifrance.com/resources/bloody-roar/ bloody roar 2] [http://pohogue.angelfire.com/library/mklink.htm mklink] [http://lehartfi.at.tut.by/lib/ericsson-k.htm ericsson k600] [http://feralpaw-omm.ifrance.com/html/festival-bar/ festival bar 2004 blu] [http://macertot.ifrance.com/view/freaky-friday.htm freaky friday] [http://casloan.angelfire.com/small/pioneer-tv/ pioneer tv] [http://mckueltzi.at.tut.by/description/lib/adobe-photoshop.htm adobe photoshop 7] [http://rebuckma.angelfire.com/description/megane-sport.htm megane sport] [http://ariadnafeni.ifrance.com/resources/artronix-cd/ artronix cd rw drive] [http://nymphbmbzl222.ifrance.com/epson-cx.htm epson cx 3650] [http://ariadnafeni.ifrance.com/resources/mobili-ufficio/ mobili ufficio direzionali] [http://feralpaw-omm.ifrance.com/html/vampir-boy/ vampir boy] [http://alena344.ifrance.com/text/pentium-/ pentium 775 dissipatori e ventole] [http://ariadnafeni.ifrance.com/resources/manitoba-lago/ manitoba lago] [http://mcunderh.at.tut.by/resources/articles/ethernet-wireless.htm ethernet wireless bridge] [http://mcunderh.at.tut.by/resources/articles/mt-b.htm mt 302b] [http://feralpaw-omm.ifrance.com/html/buti-carlo/ buti carlo] [http://yoschaad.at.tut.by/lib/lmp.htm lmp] [http://agodichik.angelfire.com/styles/tank-you.htm tank you] [http://stdamin.at.tut.by/html/space-colony.htm space colony] [http://kairikekui.ifrance.com/resources/paige-davis/ paige davis sexy] [http://konstantinkar.ifrance.com/description/offerta-regali/ offerta regali friuli venezia giulia] [http://thmastrie.angelfire.com/resources/alloggio-madrid.htm alloggio madrid] [http://pohogue.angelfire.com/library/doppiette-da.htm doppiette da caccia] [http://yoschaad.at.tut.by/lib/britney-spears.htm britney spears sexi] [http://feralpaw-omm.ifrance.com/html/luigi-pareyson/ luigi pareyson] [http://webancks.at.tut.by/images/small/cinema-grandemela.htm cinema grandemela vr] [http://lasylvan.angelfire.com/new/motorola-supporto/ motorola supporto auto] [http://casloan.angelfire.com/small/provini-per/ provini per bimbi] [http://kataevka.ifrance.com/articles/batterie-sony/ batterie sony z1010] [http://habeard.angelfire.com/topic/gordon-mitchell.htm gordon mitchell] [http://sagaddy.angelfire.com/styles/gangbang-sicilia/ gangbang sicilia] [http://lidresze.angelfire.com/blog/software-trasformare.htm software trasformare divx dvd] [http://lidresze.angelfire.com/blog/maori.htm maori] [http://konstantinkar.ifrance.com/description/since-supernatural/ since supernatural] [http://kairikekui.ifrance.com/resources/dance-ejay/ dance ejay 2] [http://alena344.ifrance.com/text/caches-com/ caches com] [http://macertot.ifrance.com/view/taj-mahal.htm taj mahal salome de bahia] [http://snerma.angelfire.com/text/i-delitti/ i delitti del gatto nero] [http://hehalley.at.tut.by/content/view/hermanita.htm hermanita] [http://pohogue.angelfire.com/library/laserjet.htm laserjet 1160] [http://casloan.angelfire.com/small/hard-disk/ hard disk esterno apple] [http://macertot.ifrance.com/view/moschicida.htm moschicida] [http://rebuckma.angelfire.com/description/donna-dentro.htm donna dentro casa] [http://alena344.ifrance.com/text/tracy-chapman/ tracy chapman] [http://macertot.ifrance.com/view/non-volermi.htm non volermi male] [http://lidresze.angelfire.com/blog/el-motivo.htm el motivo] [http://kairikekui.ifrance.com/resources/max/ max71] [http://nymphbmbzl222.ifrance.com/amilo-d.htm amilo d1845 cd] [http://macertot.ifrance.com/view/masterizzatore-dvd.htm masterizzatore dvd pc portatile] [http://brandalinden.ifrance.com/topic/international-superstar.htm international superstar soccer su gba] [http://wowinoth.at.tut.by/web/ragazzo-praga.htm ragazzo praga] [http://kataevka.ifrance.com/articles/obsecion-adventura/ obsecion adventura] [http://lehartfi.at.tut.by/lib/webcam-live.htm webcam live effects] [http://nymphbmbzl222.ifrance.com/dare-per.htm dare per un hero] [http://macertot.ifrance.com/view/combattimento-due.htm combattimento due giocatori] [http://lehartfi.at.tut.by/lib/www-federbridge.htm www federbridge it] [http://isabellaval.ifrance.com/nardone-prof/ nardone prof giorgio] [http://hewvey.ifrance.com/library/shoa/ shoa] [http://isabellaval.ifrance.com/peluche-winnie/ peluche winnie the pooh] [http://feralpaw-omm.ifrance.com/html/persempre/ persempre] [http://wifry.angelfire.com/styles/summers-montague.htm summers montague] [http://agodichik.angelfire.com/styles/hotels-con.htm hotels con sauna e piscina in alto adige] [http://lidresze.angelfire.com/blog/gaussian.htm gaussian94] [http://ariadnafeni.ifrance.com/resources/person-person/ person person] [http://kairikekui.ifrance.com/resources/le-sedicenni/ le sedicenni] [http://kataevka.ifrance.com/articles/inno-euro/ inno euro 2004] [http://dweejah.ifrance.com/new/internet-casino/ internet casino gambling] [http://hehalley.at.tut.by/content/view/roberto-cavalli.htm roberto cavalli intimo] [http://jrosestar.ifrance.com/html/prestito-rho/ prestito rho] [http://isabellaval.ifrance.com/www-sita/ www sita it] [http://isabellaval.ifrance.com/siglo-xv/ siglo xv y xvi] [http://seedging.at.tut.by/text/directory/il-giapponese.htm il giapponese] [http://grsaltrie.at.tut.by/text/directory/favero-gioiello.htm favero gioiello] [http://wipitts.at.tut.by/text/directory/gioco-sporco.htm gioco sporco] [http://zaweaver.at.tut.by/text/directory/ray-ban.htm ray ban 4039] [http://gaburlei.angelfire.com/resources/marimba-dreams.htm marimba dreams] [http://seedging.at.tut.by/text/directory/kemal-monteno.htm kemal monteno] [http://casloan.angelfire.com/small/corrente-inglese/ corrente inglese] [http://stdamin.at.tut.by/html/sony-hdvi.htm sony hdv1080i videocamera] [http://hewvey.ifrance.com/library/travelmate-wlmi/ travelmate 2702wlmi portatili] [http://lasylvan.angelfire.com/new/aspirapolveri-filtro/ aspirapolveri filtro ad acqua] [http://isabellaval.ifrance.com/fish-frenzy/ fish frenzy] [http://ferandol.at.tut.by/images/small/home-cinema.htm home cinema harman kardon] [http://gaburlei.angelfire.com/resources/quotazioni-fiat.htm quotazioni fiat] [http://macertot.ifrance.com/view/hotel-male.htm hotel male] [http://dylantian.ifrance.com/styles/router-dlink.htm router dlink] [http://ariadnafeni.ifrance.com/resources/hitachi-microdrive/ hitachi microdrive 4gb bulk] [http://grsaltrie.at.tut.by/text/directory/cinture-donna.htm cinture donna in strass] [http://konstantinkar.ifrance.com/description/carhartt-abbigliamento/ carhartt abbigliamento] [http://spkleins.angelfire.com/talamone/ talamone] [http://kairikekui.ifrance.com/resources/suoni-strani/ suoni strani] [http://ariadnafeni.ifrance.com/resources/monaco-luci/ monaco luci rosse] [http://konstantinkar.ifrance.com/description/ramsteins/ ramsteins] [http://kedewber.at.tut.by/topic/eliche.htm eliche] [http://grsaltrie.at.tut.by/text/directory/elefantes.htm elefantes] [http://codice-tributi.6pense.cn/ codice tributi] [http://martin-short.infoforit.info/ martin short] [http://asus-ave.likit.info/ asus a8ve se sock 939] [http://moni.usitus.info/ moni] [http://msn-messenger.itmilan.info/ msn messenger gay] [http://radio-dvd.infoforit.info/ radio dvd mp3] [http://utility-video.waked.cn/ utility video multimedia] [http://istituti-di.usait.info/ istituti di nocera inferiore] [http://il-medico.itforus.info/ il medico la studentessa] [http://chanel-allure.waked.cn/ chanel allure homme sport] [http://scan-tab.likit.info/ scan tab] [http://unico.6pense.cn/ unico2004] [http://adventure-x.infoforit.info/ adventure x] [http://impossibl.itmilan.info/ impossibl] [http://km-bmw.likit.info/ km0 bmw 530 diesel auto km 0] [http://amplificatore-puccini.usitus.info/ amplificatore puccini] [http://im-so.waked.cn/ im so exited] [http://agriturismo-arcore.usait.info/ agriturismo arcore] [http://invitation-cards.likit.info/ invitation cards] [http://altoparlanti-infinity.6pense.cn/ altoparlanti infinity beta] [http://onar-lerek.waked.cn/ onar lerek] [http://testi-blink.itforus.info/ testi blink 182] [http://edimburgo-hotel.usait.info/ edimburgo hotel] [http://italian-anthem.usait.info/ italian anthem] [http://travelmate-wlmi.usitus.info/ travelmate 4602wlmi] [http://rojo-tvn.waked.cn/ rojo tvn cl] [http://pro-max.mered.cn/ pro max 90] [http://gli-eroi.infoforit.info/ gli eroi del 11 settembre 2000] [http://love-lounge.6pense.cn/ love lounge] [http://auto-noleggio.infoforit.info/ auto noleggio novi ligure] [http://combo-divx.usait.info/ combo divx vhs] [http://foto-stampa.usitus.info/ foto stampa digitale] [http://ghost-goblins.seeded.cn/ ghost goblins] [http://hotel-galatina.tanned.cn/ hotel galatina] [http://yu-yu.rekki-most.cn/ yu yu hakusho ghost fighters box 5] [http://ddr-pci.tanned.cn/ ddr2 pci express] [http://mf-he.infoforit.info/ mf he700] [http://isola-d.itmilan.info/ isola d elba traghetti] [http://lampada-trifacciale.likit.info/ lampada trifacciale] [http://moto-zundapp.tanned.cn/ moto zundapp] [http://clio-esport.itforus.info/ clio esport] [http://u-ciebie.mered.cn/ u ciebie w mie 347 cie] [http://eroe-per.itmilan.info/ eroe per famiglie] [http://lettore-cd.itforus.info/ lettore cd per dj pioneer] [http://telecomando-xp.mered.cn/ telecomando xp media center] [http://abbey-mutuo.likit.info/ abbey mutuo] [http://faq.6pense.cn/ faq] [http://cavo-hp.likit.info/ cavo hp ipaq] [http://stati-see.altars.cn/ stati see] [http://brasiliane-foto.seeded.cn/ brasiliane foto] [http://r-b.waked.cn/ r b summer] [http://albergo-economico.6pense.cn/ albergo economico valencia] [http://f-u.waked.cn/ f u right back di frankee] [http://la-via.likit.info/ la via del possesso] [http://j-s.infoforit.info/ j s bach suite] [http://paul-marshall.likit.info/ paul marshall jonson] [http://fraia.usait.info/ fraia] [http://smashing-pupmkins.itmilan.info/ smashing pupmkins] [http://www-onlygonzo.usait.info/ www onlygonzo org] [http://maryeva.mered.cn/ maryeva] [http://z-fujifilm.itmilan.info/ z1 fujifilm] [http://if-you.usitus.info/ if you wan t] [http://pile-torcia.itmilan.info/ pile torcia ricaricabili accessori] [http://mar-adentro.waked.cn/ mar adentro] [http://scheda-video.likit.info/ scheda video ati x800 agp] [http://pra-sonhar.likit.info/ pra sonhar] [http://fat-tits.6pense.cn/ fat tits] [http://come-persi.itmilan.info/ come persi la guerra] [http://poltroncina-stokke.6pense.cn/ poltroncina stokke] [http://indirizzi-parigi.likit.info/ indirizzi parigi] [http://diane-king.usait.info/ diane king] [http://avant-r.itmilan.info/ avant r 100 a] [http://franco-o.tanned.cn/ franco o franco] [http://free-tight.usitus.info/ free tight pussy pic] [http://athlon.usait.info/ athlon 939 3000] [http://consolidate-credit.tanned.cn/ consolidate credit card debt] [http://batteria-cellulare.usitus.info/ batteria cellulare sharp gx10] [http://immagini-berserk.itforus.info/ immagini berserk] [http://corriere-dello.usait.info/ corriere dello sport stadio] [http://avventure-trans.tanned.cn/ avventure trans] [http://dragoste-ozone.usitus.info/ dragoste ozone] [http://scanner.tanned.cn/ scanner 3770] [http://spaces-msn.itforus.info/ spaces msn] [http://incontri-di.rekki-most.cn/ incontri di sesso] [http://o-sle.itforus.info/ o sle mio] [http://fax-e.itforus.info/ fax e segreteria carta comune] [http://multifunzione-stampante.infoforit.info/ multifunzione stampante scanner laser] [http://macchina-per.itforus.info/ macchina per pane delonghi] [http://woofer.tanned.cn/ woofer 130] [http://navtech.usait.info/ navtech] [http://internal-cum.usitus.info/ internal cum] [http://f-.infoforit.info/ f 3 nikon] [http://golf-.usait.info/ golf 16 highline] [http://katharine-hepburn.altars.cn/ katharine hepburn collection] [http://hard-disk.itforus.info/ hard disk 2 5 usb2] [http://invio-sms.itforus.info/ invio sms web] [http://get-off.waked.cn/ get off me dick] [http://hotel-venezia.itforus.info/ hotel venezia albergo venezia pensione venezia] [http://camicie-ralph.tanned.cn/ camicie ralph lauren uomo] [http://ef-mm.altars.cn/ ef 70200mm f 4l usm] {{task}}


In this task, the goal is to solve the Towers of Hanoi problem with recursivity.
In this task, the goal is to solve the Towers of Hanoi problem with recursivity.
Line 13: Line 13:
if Ndisks > 0 then
if Ndisks > 0 then
Hanoi(Ndisks - 1, Start_Peg, Via_Peg, End_Peg);
Hanoi(Ndisks - 1, Start_Peg, Via_Peg, End_Peg);
Put_Line("Move disk"
Put_Line("Move disk" & Natural'Image(Ndisks) & " from " & Pegs'Image(Start_Peg) & " to " &
Pegs'Image(End_Peg));
Hanoi(Ndisks - 1, Via_Peg, End_Peg, Start_Peg);
end if;
end Hanoi;
begin
Hanoi(4);
end Towers;


==[[AppleScript]]==
[[Category:AppleScript]]
global moves --this is so the handler 'hanoi' can see the 'moves' variable
set moves to ""
hanoi(4, "peg A", "peg C", "peg B")
on hanoi(ndisks, fromPeg, toPeg, withPeg)
if ndisks is greater than 0 then
hanoi(ndisks - 1, fromPeg, withPeg, toPeg)
set moves to moves & "Move disk " & ndisks & " from " & fromPeg & " to " & toPeg & return
hanoi(ndisks - 1, withPeg, toPeg, fromPeg)
end if
return moves
end hanoi


==[[C plus plus|C++]]==
[[Category:C plus plus]]
'''Compiler:''' [[GCC]]

void move(int n, int from, int to, int via) {
if (n == 1) {
std::cout << "Move disk from pole " << from << " to pole " << to << std::endl;
} else {
move(n - 1, from, via, to);
move(1, from, to, via);
move(n - 1, via, to, from);
}
}



==[[E]]==
[[Category:E]]

def move(out, n, fromPeg, toPeg, viaPeg) {
if (n.aboveZero()) {
move(out, n.previous(), fromPeg, viaPeg, toPeg)
out.println(`Move disk $n from $fromPeg to $toPeg.`)
move(out, n.previous(), viaPeg, toPeg, fromPeg)
}
}
move(stdout, 4, def left {}, def right {}, def middle {})

==[[Forth]]==
[[Category:Forth]]
With locals:

CREATE peg1 ," left "
CREATE peg2 ," middle "
CREATE peg3 ," right "
: .$ COUNT TYPE ;
: MOVE-DISK
LOCALS| via to from n |
n 1 =
IF CR ." Move disk from " from .$ ." to " to .$
ELSE n 1- from via to RECURSE
1 from to via RECURSE
n 1- via to from RECURSE
THEN ;

Without locals, executable pegs:

: left ." left" ;
: right ." right" ;
: middle ." middle" ;
: print ( t f -- )
CR ." Move disk from " execute ." to " execute ;
: move-disk ( v t f n -- v t f )
dup 1 = if drop 2dup print exit then
1- >R
rot swap R@ ( t v f n-1 ) recurse
rot swap 2dup print
swap rot R> ( f t v n-1 ) recurse
swap rot ;
: hanoi ( n -- )
1 max >R ['] right ['] middle ['] left R> move-disk drop drop drop ;

==[[Java]]==
[[Category:Java]]

public void move(int n, int from, int to, int via) {
if (n == 1) {
System.out.println("Move disk from pole " + from + " to pole " + to);
} else {
move(n - 1, from, via, to);
move(1, from, to, via);
move(n - 1, via, to, from);
}
}

==[[Perl]]==
[[Category:Perl]]
sub move {
my $n = shift;
my $from = shift;
my $to = shift;
my $via = shift;
if ($n == 1) {
print "Move disk from pole $from to pole $to.\n";
} else {
move($n - 1, $from, $via, $to);
move(1, $from, $to, $via);
move($n - 1, $via, $to, $from);
};
};

==[[Pop11]]==
[[Category:Pop11]]

define hanoi(n, src, dst, via);
if n > 0 then
hanoi(n - 1, src, via, dst);
printf('Move disk ' >< n >< ' from ' >< src >< ' to ' >< dst >< '.\n');
hanoi(n - 1, via, dst, src);
endif;
enddefine;

hanoi(4, "left", "middle", "right");

==[[Python]]==
[[Category:Python]]

<pre>
def hanoi(ndisks, startPeg=1, endPeg=3):
if ndisks:
hanoi(ndisks-1, startPeg, 6-startPeg-endPeg)
print "Move disk %d from peg %d to peg %d" % (ndisks, startPeg, endPeg)
hanoi(ndisks-1, 6-startPeg-endPeg, endPeg)

hanoi(ndisks=4)
</pre>

==[[Seed7]]==
[[Category:Seed7]]

const proc: hanoi (in integer: disk, in string: source, in string: dest, in string: via) is func
begin
if disk > 0 then
hanoi(pred(disk), source, via, dest);
writeln("Move disk " <& disk <& " from " <& source <& " to " <& dest);
hanoi(pred(disk), via, dest, source);
end if;
end func;

==[[Toka]]==
[[Category:Toka]]

value| sa sb sc n |
[ to sc to sb to sa to n ] is vars!
[ ( num from to via -- )
vars!
n 0 <>
[
n sa sb sc
n 1- sa sc sb recurse
vars!
." Move a ring from " sa . ." to " sb . cr
n 1- sc sb sa recurse
] ifTrue
] is hanoi

Revision as of 13:05, 8 September 2007

Task
Towers of Hanoi
You are encouraged to solve this task according to the task description, using any language you may know.

In this task, the goal is to solve the Towers of Hanoi problem with recursivity.

Ada

with Ada.Text_Io; use Ada.Text_Io;

procedure Towers is
   type Pegs is (Left, Center, Right);
   procedure Hanoi (Ndisks : Natural; Start_Peg : Pegs := Left; Via_Peg : Pegs := Center; End_Peg : Pegs := Right) is
   begin
      if Ndisks > 0 then
         Hanoi(Ndisks - 1, Start_Peg, Via_Peg, End_Peg);
         Put_Line("Move disk" & Natural'Image(Ndisks) & " from " & Pegs'Image(Start_Peg) & " to " &
            Pegs'Image(End_Peg));
         Hanoi(Ndisks - 1, Via_Peg, End_Peg, Start_Peg);
      end if;
   end Hanoi;
begin
   Hanoi(4);
end Towers;


AppleScript

global moves --this is so the handler 'hanoi' can see the 'moves' variable
set moves to ""
hanoi(4, "peg A", "peg C", "peg B")

on hanoi(ndisks, fromPeg, toPeg, withPeg)
    if ndisks is greater than 0 then
        hanoi(ndisks - 1, fromPeg, withPeg, toPeg)
        set moves to moves & "Move disk " & ndisks & " from " & fromPeg & " to " & toPeg & return
        hanoi(ndisks - 1, withPeg, toPeg, fromPeg)
    end if
    return moves
end hanoi


C++

Compiler: GCC

void move(int n, int from, int to, int via) {
  if (n == 1) {
    std::cout << "Move disk from pole " << from << " to pole " << to << std::endl;
  } else {
    move(n - 1, from, via, to);
    move(1, from, to, via);
    move(n - 1, via, to, from);
  }
}


E

def move(out, n, fromPeg, toPeg, viaPeg) {
    if (n.aboveZero()) {
        move(out, n.previous(), fromPeg, viaPeg, toPeg)
        out.println(`Move disk $n from $fromPeg to $toPeg.`)
        move(out, n.previous(), viaPeg, toPeg, fromPeg)
    }
}

move(stdout, 4, def left {}, def right {}, def middle {})

Forth

With locals:

CREATE peg1 ," left "   
CREATE peg2 ," middle " 
CREATE peg3 ," right " 

: .$   COUNT TYPE ;
: MOVE-DISK 
  LOCALS| via to from n | 
  n 1 =
  IF   CR ." Move disk from " from .$ ." to " to .$ 
  ELSE n 1- from via to RECURSE 
       1    from to via RECURSE 
       n 1- via to from RECURSE 
  THEN ;

Without locals, executable pegs:

: left   ." left" ;
: right  ." right" ;
: middle ." middle" ;

: print ( t f -- )
  CR ." Move disk from " execute ."  to " execute  ;
: move-disk ( v t f n -- v t f )
  dup 1 = if drop 2dup print exit then
  1-       >R
  rot swap R@ ( t v f n-1 ) recurse
  rot swap        2dup print
  swap rot R> ( f t v n-1 ) recurse
  swap rot ;
: hanoi ( n -- )
  1 max >R ['] right ['] middle ['] left R> move-disk drop drop drop ;

Java

 public void move(int n, int from, int to, int via) {
   if (n == 1) {
     System.out.println("Move disk from pole " + from + " to pole " + to);
   } else {
     move(n - 1, from, via, to);
     move(1, from, to, via);
     move(n - 1, via, to, from);
   }
 }

Perl

sub move {
    my $n    = shift;
    my $from = shift;
    my $to   = shift;
    my $via  = shift;

    if ($n == 1) {
        print "Move disk from pole $from to pole $to.\n";
    } else {
        move($n - 1, $from, $via, $to);
        move(1, $from, $to, $via);
        move($n - 1, $via, $to, $from);
    };
};

Pop11

define hanoi(n, src, dst, via);
if n > 0 then
    hanoi(n - 1, src, via, dst);
    printf('Move disk ' >< n >< ' from ' >< src >< ' to ' >< dst >< '.\n');
    hanoi(n - 1, via, dst, src);
endif;
enddefine;
hanoi(4, "left", "middle", "right");

Python

def hanoi(ndisks, startPeg=1, endPeg=3):
    if ndisks:
        hanoi(ndisks-1, startPeg, 6-startPeg-endPeg)
        print "Move disk %d from peg %d to peg %d" % (ndisks, startPeg, endPeg)
        hanoi(ndisks-1, 6-startPeg-endPeg, endPeg)

hanoi(ndisks=4)

Seed7

const proc: hanoi (in integer: disk, in string: source, in string: dest, in string: via) is func
  begin
    if disk > 0 then
      hanoi(pred(disk), source, via, dest);
      writeln("Move disk " <& disk <& " from " <& source <& " to " <& dest);
      hanoi(pred(disk), via, dest, source);
    end if;
  end func;

Toka

value| sa sb sc n |
[ to sc to sb to sa to n ] is vars!
[ ( num from to via -- )
  vars!
  n 0 <>
  [
    n sa sb sc 
    n 1- sa sc sb recurse
    vars!
    ." Move a ring from " sa . ." to " sb . cr
    n 1- sc sb sa recurse
  ] ifTrue
] is hanoi