This document discusses recursion, which refers to a programming technique where a function calls itself, either directly or indirectly. It provides examples of direct and indirect recursion and explains that for recursion to be usable, it needs to have a base case or exit condition to make it finite. The base case is a condition whose result is already known, like a factorial function where factorial(1) = 1. The document compares recursion to iteration, noting that recursion uses more memory due to allocating new memory for each call, while iteration repeats the same code and variables. It provides some guidelines on when to use recursion vs iteration based on code length, complexity, time, and efficiency considerations. Finally, it provides some practice problems to write programs recursively.