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)....
Code:
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);
}
return;
}
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.
If you're interested, you might want to check out a book on fractals. Those pretty much are recursive by definition.