Recursion involves a self-calling functions. Lots of functions in Haskell should be written like this as it allows
for a very elegant representation of what a function does rather than how to compute it.

When trying to define a function recursively, first start with the base case, then think about the algorithm in a trivial case and how that can be implemented in code, think about it abstractly, make sure all situations are covered.