Recursion is a method where a function calls itself to solve smaller parts of a problem. The function keeps calling itself with smaller inputs until it reaches a base case, which stops the recursion. Each call waits for the next call to finish before it can return its result. This creates a call stack where each function call is stacked on top of the previous one. When the base case returns a value, the calls start returning one by one, combining results. For example, factorial(3) calls factorial(2), which calls factorial(1), which calls factorial(0). factorial(0) returns 1, then factorial(1) returns 1*1=1, factorial(2) returns 2*1=2, and factorial(3) returns 3*2=6. The call stack grows as calls are made and shrinks as results return.