This document discusses recursion in programming. Recursion is when a function calls itself, either directly or indirectly. For a recursive function to work properly it must have a base case, which provides the terminating condition, and make progress toward the base case with each recursive call. Examples of recursively defined functions include factorials, powers, Fibonacci numbers, and towers of Hanoi. Recursion allows for simple programming of some complex problems but iterative solutions may have better performance due to less function call overhead.