Distributed Computing by Mobile Robots: Solving the Uniform Circle Formation Problem