function solve(problem):

   if problem is small enough:
      return solve_directly(problem)
   parts = divide(problem)
   solved_parts = [solve(part) for part in parts] # recurse
   return combine(solved_parts)
 # merge sort divides in half; a moving job divides by room
