This is a non-recursive version of the Towers of Hanoi, first published in 1984 [1]. I updated it to modern Fortran a few years back.
program towersHanoi
integer :: disks
write (*,*) 'How many disks? '
read (*,50) disks
50 format (I2)
call tower(disks)
end program towersHanoi
Here is the subroutine tower()
, which does the actual processing:
subroutine tower(total)
integer, intent(in) :: total
integer :: fromT, toT, disk, temp, i
integer, dimension(10) :: bitstr, hold
do i = 1,10
bitstr(i) = 0
hold(i) = 1
end do
temp = 3 - mod(total,2)
do i = 1, 2**total - 1
disk = incr(bitstr)
if (disk == 1) then
fromT = hold(1)
toT = 6 - fromT - temp
temp = fromT
else
fromT = hold(disk)
toT = 6 - hold(1) - hold(disk)
end if
write (*,50) "Move disk ", disk, " from tower ", fromT, " to tower", toT
50 format(A,I2,A,I2,A,I2)
hold(disk) = toT
end do
end subroutine tower
Here is the integer function incr()
:
integer function incr(bitstr)
integer, dimension(10), intent(inout) :: bitstr
integer :: i
i = 1
do
if (bitstr(i) == 0) then
bitstr(i) = 1
incr = i
exit
end if
bitstr(i) = 0
i = i + 1
end do
return
end function incr
Here is the program functioning:
How many disks?
3
Move disk 1 from tower 1 to tower 3
Move disk 2 from tower 1 to tower 2
Move disk 1 from tower 3 to tower 2
Move disk 3 from tower 1 to tower 3
Move disk 1 from tower 2 to tower 1
Move disk 2 from tower 2 to tower 3
Move disk 1 from tower 1 to tower 3
Further reading:
- Mayer, H., Perkins, D., “Towers of Hanoi revisited: A nonrecursive surprise”, SIGPLAN Notices, Vol.19(2), pp.80-84 (1984)