Obvious recursive solution may be inherently inefficient. E.g. Fibonacci:

Therefore, it is essential, after we have solved the problem, to critically examine our solution and attempt to improve on it; both by removing sources of inefficiency and by refining its elegance.

Tail Recursion: is a critical notion. A tail recursive algorithm executes in constant space and can be highly optimized by the compiler. We now take a brief look at it.