;;; -*- Mode: LISP; Syntax: Common-lisp; Package: USER; Base: 10 -*- (in-package :User) ;;;========================================================================= ;;; Simple towers of Hanoi program. Note that Start-Peg and Goal-Peg are ;;; integers from 1 to 3 indicating the peg number. Ie to move 4 discs, ;;; starting on the first peg and finishing on the last one, execute ;;; (Towers 4 1 3) ;;; ;;; 1992 Marty Hall. hall@aplcenmp.apl.jhu.edu (defun Towers (Number-of-Discs Start-Peg Goal-Peg) (cond ((= 1 Number-of-Discs) (format t "~%Move Top Disc from peg ~D to peg ~D." Start-Peg Goal-Peg)) (t (Towers (1- Number-of-Discs) Start-Peg (Remaining-Peg Start-Peg Goal-Peg)) (Towers 1 Start-Peg Goal-Peg) (Towers (1- Number-of-Discs) (Remaining-Peg Start-Peg Goal-Peg) Goal-Peg)))) ;;;========================================================================= ;;; Given two peg numbers, what is the peg number of the third peg? (defun Remaining-Peg (Peg1 Peg2) (- 6 Peg1 Peg2)) ;;;========================================================================= ;;; Here is some sample output using the above code. ;Yes, Marty? (towers 1 1 2) ;Move Top Disc from peg 1 to peg 2. ;NIL ;Yes, Marty? (towers 2 1 2) ;Move Top Disc from peg 1 to peg 3. ;Move Top Disc from peg 1 to peg 2. ;Move Top Disc from peg 3 to peg 2. ;NIL ;Yes, Marty? (towers 3 1 2) ;Move Top Disc from peg 1 to peg 2. ;Move Top Disc from peg 1 to peg 3. ;Move Top Disc from peg 2 to peg 3. ;Move Top Disc from peg 1 to peg 2. ;Move Top Disc from peg 3 to peg 1. ;Move Top Disc from peg 3 to peg 2. ;Move Top Disc from peg 1 to peg 2. ;NIL ;Yes, Marty? (towers 4 1 2) ;Move Top Disc from peg 1 to peg 3. ;Move Top Disc from peg 1 to peg 2. ;Move Top Disc from peg 3 to peg 2. ;Move Top Disc from peg 1 to peg 3. ;Move Top Disc from peg 2 to peg 1. ;Move Top Disc from peg 2 to peg 3. ;Move Top Disc from peg 1 to peg 3. ;Move Top Disc from peg 1 to peg 2. ;Move Top Disc from peg 3 to peg 2. ;Move Top Disc from peg 3 to peg 1. ;Move Top Disc from peg 2 to peg 1. ;Move Top Disc from peg 3 to peg 2. ;Move Top Disc from peg 1 to peg 3. ;Move Top Disc from peg 1 to peg 2. ;Move Top Disc from peg 3 to peg 2. ;NIL ;