Recursion is a function calling itself with a smaller problem. Each call pushes a new frame onto the call stack, holding its own arguments, until the base case says stop.
Then the magic half: the stack unwinds. Each frame pops and hands its result to the caller below it. Forget the base case and the frames never stop piling up: that's literally a stack overflow.