A non-recursive Towers of Hanoi

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:

  1. Mayer, H., Perkins, D., “Towers of Hanoi revisited: A nonrecursive surprise”, SIGPLAN Notices, Vol.19(2), pp.80-84 (1984)

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.