retroforth/example/hanoi.forth
crc 578870c912 more commentary on hanoi.forth
FossilOrigin-Name: 81a94c8955c51163b360d83bce0c11eb130d15c8c6617db7b00a7e5fc7253803
2017-10-22 18:50:54 +00:00

56 lines
1.4 KiB
Forth

The Tower of Hanoi (also called the Tower of Brahma or Lucas' Tower
and sometimes pluralized) is a mathematical game or puzzle. It
consists of three rods and a number of disks of different sizes,
which can slide onto any rod. The puzzle starts with the disks in
a neat stack in ascending order of size on one rod, the smallest
at the top, thus making a conical shape.
The objective of the puzzle is to move the entire stack to another
rod, obeying the following simple rules:
- Only one disk can be moved at a time.
- Each move consists of taking the upper disk from one of the
stacks and placing it on top of another stack.
- No disk may be placed on top of a smaller disk.
With 3 disks, the puzzle can be solved in 7 moves. The minimal
number of moves required to solve a Tower of Hanoi puzzle is
2^n-1, where n is the number of disks.
Taken from https://en.m.wikipedia.org/wiki/Tower_of_Hanoi
I am tracking state in a few variables, so I define them first.
~~~
'Num var
'From var
'To var
'Via var
~~~
Next, a quick word to setup all the variables.
~~~
:set-vars !Via !To !From !Num ;
~~~
Then, implementing the recursive alogrithim from the Wikipedia article:
~~~
:hanoi (num,from,to,via-)
set-vars
@Num n:-zero?
[
@Num @From @To @Via
@Num n:dec @From @Via @To hanoi
set-vars
@To @From '\nMove_a_ring_from_%n_to_%n s:with-format puts
@Num n:dec @Via @To @From hanoi
] if ;
~~~
And a test.
~~~
#3 #1 #3 #2 hanoi nl
~~~