Recursion is a technique that involves defining a function in terms of itself via self-referential calls. It can be used to loop without an explicit loop statement. A recursive function must have a base case that does not involve further recursion in order to terminate after a finite number of calls. When a recursive function is called, information like function values and local variables are pushed onto a call stack to keep track of each nested call.