From the introduction you may have noticed that in order to write recursive algorithms we need to follow these rules:

- There must be at least one way to stop the recursion. This is a base case.
- All recursive calls must lead to some base case.

Not all problems are recursive. We can think of recursion as a subset of divide and conquer, since we are dividing the original problem in smaller ones but here the important thing to note is that this subproblems must be of exactly the same shape as the original one and therefore we can apply the original solution to the subproblems! This is, we can recurse!

Previously I mentioned that the idea of recursion comes from math, for example, you can find lots of math functions defined recursively like factorial function, also mathematical induction is recursion. The curious thing to note here is that in mathematical induction we start from the base case the general one but when programming we start from the general to the base!