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.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: A árvore de recursão: enxergar o trabalho total.
Os objetivos desta aula. 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.
Veja o essencial, parte por parte.
Cada chamada vira um galho. A árvore de recursão desenha a chamada inicial na raiz e cada subchamada como um filho.
Prever o custo antes de rodar. A grande utilidade da árvore é prever o custo sem executar o código.
Quando a árvore explode. Galhos que repetem o mesmo subproblema: retrabalho que faz o custo explodir (pede memoização).
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
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.
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.