Write a function called **identical_indexes** that takes two lists and returns a list containing the indexes into both lists where the values are identical. If there are no such values, the function should return an empty list. Be careful to not have an index out of bounds error.

Essentially, trees are an **abstraction** that allow for hierarchical organization of “things”. These “things” can be anything, but when we’re learning trees they are often numbers (or letters). An abstract data type just means that it is a way of organizing data that we may use later, without care for how the abstraction is actually implemented (for example with lists, or with a class).

Recursion occurs when a function calls **itself**. Recursion is useful when dealing with problems that have recursive properties. Consider a function **factorial(n)** that returns the factorial of **n**. This function can be defined recursively because **factorial(5) = 5 * factorial(4) = 5 * 4 * factorial(3) **and so on.

Stack is a data structure that follows the property of **F**irst **I**n **L**ast **O**ut (**FILO**). So the first element inserted into a stack will be the last element deleted from the stack. You can think of a stack as a stack of dishes. The first dish that goes into the stack will be the last one to be used.

The problem is: Given **N** pairs of parentheses, write a function to generate all combinations of well-formed parentheses. The naive solution is to generate all combinations of **N** pairs of parentheses, then checking if each one is valid.