I have the following objects:

```
enum Slot
{
   HANDS, LEGS, CHEST, HEAD, FEET;
}

class Clothing
{
   // The slot this piece of clothing is worn on.
   Slot s;
   // The color of the clothing, used for `gradeOutfit`
   Color c;
}

class Person
{
   Map<Slot, Clothing> body;

   // look through his outfit and give a score
   // for how well he looks
   int gradeOutfit()
   {
      return ...
   }
}

```

I have one `Person` object and a collection of `Clothing`. This collection has many `Clothing` objects of each `Slot`. For example, it might look like this:

```
MyCloset = { GREEN_HAT, RED_VEST, BLACK_VEST, 
BLUE_JEANS, BROWN_PANTS, RED_SHOES, BLACK_HAT, BLUE_GLOVES, PURPLE_VEST }

```

In the reality of my program, there are a lot more items than just these but this is just a simplified example. 

**Problem:**

I need to find a combination of these clothes that lead to the highest `gradeOutfit` score. That means my `Person` will have to make sure he tries on every `Clothing` item with every other `Clothing` item (within limits, ex. it's impossible for two hats to be worn because both are for `HEAD` `Slot`). A `Person` cannot have their `gradeOutfit` called until they are wearing a `Clothing` item for every `Slot`.

I was thinking recursion is the best way to do this but then I think I'd get a stack overflow very fast if I had a decent amount of items. I tried doing it iteratively but I cannot seem to find a good easy way to loop through everything. My program basically looks like

```
Person p = new Person();
for (Clothing i : MyCloset)
{
    for (Clothing h : MyCloset)
    {
        if (i == h) continue;

        if (!p.isWearing(h.slot())
        {
            p.wear(h);
        }
    }

    int score = p.gradeOutfit();
}

```

But I know this is just a terrible approach. In order to ensure that every clothing item has been paired up with every other Clothing item, I would need so much more looping logic than just this. No matter what I try, it turns into spaghetti code. I also need to avoid looping over the same outfit twice and make sure that no outfit combination is forgotten about.

What is the best way to approach something like this?