My experience has been that recursion is mostly used in searching and sorting problems where a divide-and-conquer method is used. Divide-and-conquer refers to solving a problem with a large data set by reducing it to two smaller data sets, and solving for each of those.
Sometimes recusrion just makes more sense. For example, the towers of Hanoi (http://www.cut-the-knot.com/recurrence/hanoi.html)....
Other problems too, like say, try to find how many paths there are from the bottom left cell of a square to the top right cell of the square. These are problems where a stack needs to be used, and it's often more convenient to use the function's stack than try to make your own.
void hanoi (int src, int aux, int dest, int num)
if (num != 0)
// Move the pegs above to the auxillary peg...
hanoi (src, dest, aux, num - 1);
// Move the current peg to the destination peg...
printf ("Peg moved from %d to %d.\n", src, dest);
// Move the pegs from the auxillary peg to dest
hanoi (aux, src, dest, num - 1);
If you're interested, you might want to check out a book on fractals. Those pretty much are recursive by definition.