To understand recursion one must first understand recursion.
Learn about basic recursive algorithms, and then go on to more advanced techniques.
The challenges can be solved in any language, but the examples are in Java.