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

A árvore de recursão: enxergar o trabalho total

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

O que você vai aprender

  • Desenhar a árvore de recursão de uma função que se chama várias vezes.
  • Ler a profundidade e a largura da árvore para estimar o trabalho.
  • Distinguir recursão barata (uma chamada por nível) de cara (várias).
  • Prever a ordem em que as chamadas terminam e devolvem valores.

Cada chamada vira um galho

Uma função recursiva raramente age sozinha. Ela chama a si mesma, e cada uma dessas chamadas pode chamar de novo, formando uma cadeia ou uma ramificação. Para entender o que a recursão realmente faz, o melhor é desenhar. A chamada que você fez vira a raiz, no topo. Cada chamada que ela dispara vira um galho descendo. Se cada chamada dispara duas, a árvore se abre em dois a cada nível; se dispara uma, a árvore é um fio reto descendo. O desenho não é enfeite: ele responde às duas perguntas que decidem o custo, quantas chamadas acontecem no total e quão fundo elas vão.

A altura da árvore é a profundidade da recursão. Ela conta quantas chamadas ficam abertas ao mesmo tempo, uma esperando a outra terminar. Isso importa porque cada chamada aberta ocupa espaço na pilha de chamadas do programa, e uma profundidade absurda estoura essa pilha. A largura, por outro lado, conta quantas chamadas existem em cada nível. Multiplicar a largura pela quantidade de níveis dá uma ideia do número total de chamadas, e é aí que mora a diferença entre uma recursão que voa e uma que trava. Uma árvore alta e fina é barata; uma árvore que dobra de largura a cada nível pode ter um número gigantesco de chamadas.

Duas árvores de recursão lado a lado. À esquerda, uma árvore reta e fina rotulada uma chamada por nível: a raiz aponta para um único filho, que aponta para outro, descendo em linha. À direita, uma árvore que se ramifica rotulada duas chamadas por nível: a raiz tem dois filhos, cada um tem dois, dobrando a cada nível e ficando larga embaixo. Rótulos marcam altura como profundidade e a base larga como custo total.
Esquerda: recursão barata, um galho por nível. Direita: recursão que dobra, com um número de chamadas que cresce rápido.

Prever o custo antes de rodar

A grande utilidade da árvore é prever o custo sem executar o código. Compare dois casos. Uma função que soma de n até zero se chama uma vez por passo: a árvore é um fio de altura n, com n chamadas no total, barato. Agora a função clássica de Fibonacci ingênua, em que fib de n chama fib de n menos um e fib de n menos dois: cada chamada dispara duas, e a árvore quase dobra de tamanho a cada nível. Para um n pequeno já são centenas de chamadas; para um n médio, milhões, muitas delas repetindo exatamente o mesmo cálculo. Ao desenhar a árvore você vê o desastre antes de rodar e percebe que dá para consertar guardando resultados, ideia que volta no módulo de memoização.

🎮 Jogo da aula

Conte as chamadas

Esta função conta quantas vezes ela mesma é chamada. Desenhe a árvore de recursão na cabeça e diga o número que aparece.

contador <- 0
FUNÇÃO f(n)
  contador <- contador + 1
  SE n <= 1 ENTÃO
    RETORNE 1
  FIM
  RETORNE f(n - 1) + f(n - 2)
FIM
f(4)
escreva(contador)

Quando a árvore explode

Ler a árvore ensina a farejar dois perigos. O primeiro é a árvore que se ramifica e repete: quando o mesmo subproblema aparece em vários galhos, a recursão recalcula a mesma coisa de novo e de novo, e o custo dispara. O sinal é ver o mesmo rótulo se repetindo pela árvore, como os vários fib de 2. O segundo perigo é a árvore alta demais, mesmo que fina: se a profundidade chega a dezenas de milhares, a pilha de chamadas do programa pode estourar antes de a resposta sair. Nos dois casos a solução não é abandonar a recursão, e sim reconhecê-la a tempo, seja guardando resultados repetidos, seja trocando a recursão profunda por um laço, tema da última aula deste módulo.

Teste rápido

O que a ALTURA da árvore de recursão representa?

Perguntas frequentes

Para que serve desenhar a árvore de recursão?
Para prever o custo de uma função recursiva antes de rodá-la. A árvore mostra quantas chamadas acontecem e quão fundo elas vão. Com ela você percebe cedo se a recursão vai voar ou travar, e se há retrabalho a eliminar. É uma ferramenta de raciocínio, não algo que o programa desenha: você a esboça no papel ou na cabeça para entender o algoritmo.
Qual a diferença entre profundidade e número de chamadas?
Profundidade é a altura da árvore, quantas chamadas ficam empilhadas ao mesmo tempo. Número de chamadas é o total de nós da árvore inteira. Uma recursão pode ser profunda com poucas chamadas (um fio alto) ou rasa com muitas chamadas (uma árvore larga e baixa). Os dois medem coisas diferentes: profundidade afeta a pilha, número de chamadas afeta o tempo.
Por que o Fibonacci ingênuo é tão lento?
Porque cada chamada dispara duas, então a árvore quase dobra de tamanho a cada nível. Pior: o mesmo subproblema aparece em muitos galhos e é recalculado várias vezes. Para um n médio isso vira milhões de chamadas repetidas. A árvore de recursão deixa esse desperdício visível, e a cura é guardar os resultados já calculados, o que se estuda em memoização.
O que causa o erro de estouro de pilha?
É a profundidade da recursão passar do limite que o programa reserva para a pilha de chamadas. Cada chamada aberta ocupa um espaço; se você empilha dezenas de milhares sem fechar nenhuma, o espaço acaba e o programa para com erro. Costuma acontecer quando o caso base está errado (a recursão não para) ou quando o problema é fundo demais para recursão simples.
Uma árvore alta é sempre ruim?
Não necessariamente. Uma árvore alta e fina, com uma só chamada por nível, é barata em número de chamadas, embora ocupe pilha proporcional à altura. O problema aparece quando a altura é enorme (risco de estourar a pilha) ou quando, além de alta, a árvore é larga (muitas chamadas por nível). Altura sozinha, dentro de limites razoáveis, é aceitável.
Como a árvore ajuda a decidir entre recursão e laço?
Se a árvore é um fio reto (uma chamada por nível), aquela recursão é essencialmente um laço disfarçado e muitas vezes vale trocar por um laço, que não gasta pilha. Se a árvore se ramifica de verdade, refletindo uma divisão natural do problema, a recursão costuma expressar a lógica com mais clareza. A forma da árvore é uma boa pista para essa escolha, tratada na última aula.

Fontes

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