input: Write a python function to solve the Tower of Hanoi problem.
  assert hanoi_moves(1, 'A', 'B', 'C') == [('A', 'C')]
  assert hanoi_moves(2, 'A', 'B', 'C') == [('A', 'B'), ('A', 'C'), ('B', 'C')]
  assert hanoi_moves(3, 'A', 'B', 'C') == [('A', 'C'), ('A', 'B'), ('C', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('A', 'C')]
  assert hanoi_moves(4, 'A', 'B', 'C') == [('A', 'B'), ('A', 'C'), ('B', 'C'), ('A', 'B'), ('C', 'A'), ('C', 'B'), ('A', 'B'), ('A', 'C'), ('B', 'C'), ('B', 'A'), ('C', 'A'), ('B', 'C'), ('A', 'B'), ('A', 'C'), ('B', 'C')]
output: def hanoi_moves(n, source, auxiliary, target):
      moves = []
      
      def move_disks(n, source, auxiliary, target):
          if n == 1:
              moves.append((source, target))
          else:
              move_disks(n-1, source, target, auxiliary)
              moves.append((source, target))
              move_disks(n-1, auxiliary, source, target)
      
      move_disks(n, source, auxiliary, target)
      return moves