Tail recursion is a type of recursion where the recursive call is the last statement executed in the recursive function. This allows compilers to optimize tail recursive functions by reusing the same stack frame rather than creating new frames on each recursion. An example of a tail recursive function prints numbers from 3 to 1 by recursively calling itself and passing the decremented value. While recursion uses more space than a loop, tail recursion can be optimized to have similar space complexity to a loop.