def hanoi_iterative(n): pegs = {"A": list(range(n, 0, -1)), "B": [], "C": []} # Disk 1 always travels the same way round: A, C, B for an odd n, A, B, C for an even n. cycle = "ACB" if n % 2 == 1 else "ABC" for move in range(1, 2**n): smallest_at = cycle[(move // 2) % 3] if move % 2 == 1: # Odd moves: disk 1 steps on to the next tower in its cycle. source, target = smallest_at, cycle[(move // 2 + 1) % 3] else: # Even moves: the one legal move that leaves disk 1 alone. a, b = (peg for peg in "ABC" if peg != smallest_at) if not pegs[a] or (pegs[b] and pegs[b][-1] < pegs[a][-1]): source, target = b, a else: source, target = a, b disk = pegs[source].pop() pegs[target].append(disk) print(f"Move disk {disk} from {source} to {target}") if __name__ == "__main__": hanoi_iterative(3)