# L-10 MCS 275 Wed 3 Feb 2010 : Towers of Hanoi def write_piles(s,A,B,C): "writes contents of piles, after s" sA = '%s = %s' % (A[0],A[1]) sB = '%s = %s' % (B[0],B[1]) sC = '%s = %s' % (C[0],C[1]) print s, sA, sB, sC def write(k,m,n,A,B,C): "writes contents of piles" s = k*' ' s = s + 'move %d, n = %d :' % (m,n) write_piles(s,A,B,C) def Hanoi(n,A,B,C,k,m): """ moves n disks from A to B, C is auxiliary k is recursion level, m counts # moves writes status of piles after each move returns the tuple (A,B,C,m) """ #print k*' ' + 'Hanoi n = %d, m = %d, k = %d' % (n,m,k) if n == 1: # move disk from A to B m = m + 1 B[1].insert(0,A[1].pop(0)) write(k,m,n,A,B,C) else: # move n-1 disks from A to C, B is auxiliary (A,C,B,m) = Hanoi(n-1,A,C,B,k+1,m) # move n-th disk from A to B m = m + 1 B[1].insert(0,A[1].pop(0)) write(k,m,n,A,B,C) # move n-1 disks from C to B, A is auxiliary (C,B,A,m) = Hanoi(n-1,C,B,A,k+1,m) return (A,B,C,m) def main(): """ prompts user for the number of disks, initializes the stacks and calls Hanoi """ n = input('Give number of disks : ') A = ('A',range(1,n+1)) B = ('B',[]) C = ('C',[]) write_piles('at start :',A,B,C) m = 0 (A,B,C,m) = Hanoi(n,A,B,C,0,0) #write_piles(' at end :',A,B,C) main()