Não é difícil encontrar programadores que odeiam recursividade. Mas por quê tanto desprezo por uma técnica tão poderosa? Será que é difícil escrever funções recursivas? Códigos recursivos são sempre lentos?

Agora a verdade:
Só fala mal da recursividade quem NÃO sabe usar recursividade!

Durante a fase de projeto de um programa, é importante descobrir inicialmente qual problema estamos tentando resolver. Ou seja, precisamos inicialmente descobrir "O QUE DEVE SER FEITO", e só depois nos preocuparemos com o "COMO FAZER".

Na fase de projeto, o programador deve abstrair o problema, ou seja, deve evitar se preocupar com detalhes irrelevantes. Por exemplo, decidir se o programa será recursivo ou iterativo é irrelevante durante o projeto, é um mero detalhe de implementação!

Infelizmente, alguns programadores nunca escrevem códigos recursivos, e sabem qual a justificativa? Dizem que recursividade é lenta. E isso tem um motivo: Aprenderam recursividade com fatorial e fibonacci! E todos sabem que não devemos usar recursividade nesses casos.

Existem inúmeras situações onde a recursividade é indispensável. Basta pensar em árvores binárias, que são estruturas naturalmente recursivas. Já imaginaram manipular árvores binárias sem recursividade? Até dá para fazer, mas o esforço é desnecessário. Vamos analisar uma implementação recursiva que realiza o caminhamento pré-ordem em uma árvore binária:
void preOrdem(struct tnode *t)
{
  if(t != NULL)
  {
    printf("%d ", t->value);
    preOrdem(t->left);
    preOrdem(t->right);
  }
}
Podemos perceber que de forma clara e enxuta resolvemos o problema em poucas linhas.
Mas ainda tem quem se preocupe com o "estouro da pilha" de execução dos programas! E com isso, não quero dizer que o estouro não possa acontecer, mas será que na maioria das vezes o problema é mesmo o tal "estouro da pilha"?