That is so. Functional programming, for example, has recursion as its only control structure.
The loop:
boolean condition = init();
while (condition)
{
... condition = statement();
}
...is a very generic version of a while loop. I've made the loop initialization and body into functions and distilled the loop continuation condition down to a single boolean variable. A recursive version is:
bool loop_as_recursion(bool condition)
{
... if (condition)
... {
... ... condition = loop_as_recursion(statement());
... }
... return condition;
}
then call with:
loop_as_condition( init() );
A for-loop replacement will carry the current "loop index" as a parameter, updated upon the recursive call to have a new value in the next "iteration". Try working that out as an exercise in "thinking functionally".
I don't claim that this is the nicest way to solve a problem. I'm just pointing out that it is possible. Recursion is a nice way to describe certain problems, but I don't think it's the only tool I want in my kit.