Recursion happens when a function calls itself to solve a smaller version of the same problem. Think of Russian nesting dolls: each doll contains a smaller copy until you reach the tiniest one. That smallest doll is like your base case, the point where you stop.
Every recursive function needs two parts: a way to shrink the problem and a stopping condition. What happens without the stopping condition? Try to picture it. The function calls itself, which calls itself, which calls itself... forever. The program crashes.
With both parts in place, you can solve complex problems in surprisingly few lines.