Módulo 8 - Recursão avançada: dividir, voltar e escolher

Recursão ou iteração: qual escolher

8 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 12/07/2026

O que você vai aprender

  • Decidir entre recursão e laço a partir da estrutura do problema.
  • Reconhecer o custo de pilha da recursão e quando ele pesa.
  • Saber que recursão e iteração são intercambiáveis (dá para converter).
  • Entender a ideia de recursão em cauda e por que às vezes vira laço.

Duas ferramentas para o mesmo fim

Uma verdade que liberta: tudo que se faz com recursão se faz com laço, e vice-versa. Elas não competem por poder, competem por clareza e custo. A escolha, então, não é sobre o que é possível, e sim sobre o que fica mais legível e mais barato para cada problema. A recursão se sai bem quando o problema tem uma estrutura que se repete dentro de si: percorrer uma árvore, onde cada galho é uma árvore menor; dividir para conquistar, onde cada metade é o mesmo problema; explorar caminhos com backtracking, onde a volta vem de graça no retorno das chamadas. Nesses casos, a recursão praticamente escreve o código na forma do problema, e um laço equivalente ficaria cheio de pilhas manuais e mais confuso.

O laço, por sua vez, vence quando a repetição é linear e direta: percorrer uma lista, somar valores, contar ocorrências, repetir uma ação um número fixo de vezes. Se você desenhasse a árvore de recursão desses casos, veria um fio reto, uma chamada por nível, sinal de que a recursão está só imitando um laço, e um laço de verdade faz o mesmo sem gastar a pilha de chamadas. O peso extra da recursão é justamente esse: cada chamada aberta ocupa espaço na pilha, e em profundidade grande isso pode estourar. Um laço mantém o estado em poucas variáveis e roda em profundidade constante. Para repetição simples e possivelmente longa, o laço é a escolha segura.

Uma balança de dois pratos comparando recursão e iteração. Do lado da recursão, ícones de uma árvore ramificada e de um labirinto, com os rótulos árvores, dividir para conquistar e backtracking. Do lado da iteração, um ícone de lista com uma seta em loop e os rótulos percorrer lista, somar, contar e profundidade constante. No centro, a pergunta o problema se divide ou é linear? aponta para qual lado pesa.
A escolha depende da forma do problema: estrutura que se repete pende para recursão; repetição linear pende para o laço.

O custo de pilha e a recursão em cauda

O maior contra da recursão é o custo de pilha. Cada chamada que ainda não terminou fica guardada, esperando as de baixo, e essa espera ocupa memória proporcional à profundidade. Somar de um até um milhão com recursão simples abriria um milhão de chamadas e estouraria a pilha; o mesmo com um laço usa uma variável e vai tranquilo. Existe uma exceção elegante chamada recursão em cauda: quando a chamada recursiva é a última coisa da função, sem nenhuma conta pendente depois dela, não há o que guardar da chamada atual. Algumas linguagens percebem isso e transformam a recursão num laço nos bastidores, com profundidade constante. Nem toda linguagem faz essa otimização, então não dá para contar com ela sempre, mas entender a ideia ajuda a escrever recursões mais leves.

🎮 Jogo da aula

Recursão brilha ou laço é melhor?

Classifique cada tarefa: onde a recursão fica mais natural e onde um laço simples é a escolha melhor.

Regras práticas para decidir

Na hora de escolher, algumas perguntas resolvem quase tudo. O problema se divide em subproblemas do mesmo tipo, ou tem forma de árvore? Se sim, comece pensando recursivo, porque o código vai sair mais limpo. A repetição é linear e pode ficar muito profunda? Prefira o laço, para não arriscar a pilha. Você precisa de desempenho máximo num trecho crítico e a recursão não traz clareza extra? O laço costuma ser um pouco mais rápido, por evitar o custo das chamadas. E, se a recursão ficou mais legível mas você teme a profundidade, lembre que dá para converter: toda recursão pode virar laço com uma pilha explícita, e muitas bibliotecas fazem isso justamente para juntar a clareza do raciocínio recursivo com a segurança do laço. Clareza primeiro, custo depois, e a conversão como carta na manga.

Teste rápido

Qual é a principal desvantagem da recursão frente a um laço, para uma repetição linear muito longa?

Perguntas frequentes

Recursão é mais lenta que laço?
Costuma ser um pouco mais lenta, porque cada chamada tem um custo de abrir e fechar, e ocupa pilha. Para a maioria dos programas essa diferença é irrelevante, e a clareza vale mais. Ela só pesa em trechos muito repetidos e sensíveis a desempenho, ou quando a profundidade é enorme. Nesses casos, um laço equivalente costuma ser mais rápido e mais seguro contra estouro de pilha.
Então por que usar recursão, se o laço é mais barato?
Porque em muitos problemas a recursão é bem mais clara. Percorrer uma árvore, dividir para conquistar e backtracking têm estrutura que se repete dentro de si, e a recursão escreve o código na forma do problema. Um laço equivalente exigiria gerenciar uma pilha manualmente e ficaria mais longo e confuso. Clareza reduz bugs, e por isso a recursão vale seu custo quando o problema pede.
O que é recursão em cauda?
É quando a chamada recursiva é a última ação da função, sem nenhum cálculo pendente depois dela. Como não sobra nada para fazer ao voltar, algumas linguagens transformam essa recursão num laço automaticamente, eliminando o custo de pilha. Nem toda linguagem faz essa otimização, então não dá para depender dela sempre, mas escrever a recursão nessa forma tende a deixá-la mais leve.
Toda recursão pode virar laço?
Sim. Qualquer recursão pode ser reescrita com um laço mais uma pilha explícita que guarda o que a recursão guardaria sozinha. Recursões lineares (um fio reto) viram laços simples; recursões ramificadas exigem uma pilha visível. Bibliotecas fazem essa conversão para evitar estouro de pilha em dados profundos, mantendo o raciocínio recursivo no projeto e a segurança do laço na execução.
Como sei se meu problema pede recursão?
Pergunte se ele se divide em versões menores de si mesmo ou tem forma de árvore. Percorrer pastas dentro de pastas, ordenar por metades, explorar caminhos: tudo isso se repete dentro de si e cai bem na recursão. Se a tarefa é só repetir algo em linha reta, como somar uma lista ou contar itens, é repetição linear e o laço resolve com menos custo.
Recursão profunda demais trava o programa?
Pode travar. Cada chamada aberta ocupa a pilha, e se a profundidade passa do limite reservado, o programa para com erro de estouro de pilha. Isso acontece com recursões lineares muito longas ou com um caso base mal feito que nunca para. A saída é usar laço para repetição profunda, corrigir o caso base, ou converter a recursão em versão com pilha explícita.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.