Recursion is when a function calls itself to solve smaller instances of the same problem. Here's a classic example with factorial:
```python def factorial(n): if n <= 1: # base case return 1 return n * factorial(n - 1) # recursive call
print(factorial(5)) # Output: 120 ```
Every recursive function needs: 1) A **base case** (to stop), and 2) A **recursive case** (to reduce the problem). Without a base case, you get infinite recursion and a stack overflow.