Questão de Algoritmos e Estrutura de Dados — Algoritmos — FGV 2026
Algoritmos e Estrutura de Dados›Algoritmos
Código
fg129163
Banca
FGV
Órgão
AMAZUL
Ano
2026
Nível
Superior
Cargo
Engenheiro de Computação
Um desenvolvedor está otimizando um algoritmo recursivo de Fibonacci e observa que para n=45 o tempo de execução é inaceitável. A análise mostra que a função é chamada repetidamente com os mesmos argumentos.A técnica de otimização mais adequada para reduzir drasticamente o tempo de execução, sem alterar a natureza recursiva do algoritmo é
AMemoization
BTail recursion optimization
CLoop unrolling
DBranch prediction
ESIMD vectorization
Revelar gabarito e comentário▾
GabaritoA — Memoization
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Otimização de Algoritmo Recursivo: Fibonacci
Gabarito: letra A. A técnica de memoization consiste em armazenar os resultados de chamadas de função anteriores e reutilizá-los quando os mesmos argumentos são passados novamente, eliminando o recálculo redundante. No caso do Fibonacci recursivo ingênuo, para n=45, a explosão de chamadas repetidas (complexidade exponencial) é resolvida com memoization, mantendo a estrutura recursiva.
O problema descrito é clássico: a função Fibonacci recursiva sem otimização recalcula os mesmos subproblemas inúmeras vezes, gerando tempo de execução exponencial (O(2^n)). A memória adicional (caching) reduz a complexidade para O(n), sem alterar a recursão.
Técnica
Descrição
Aplicabilidade ao problema
Efeito no tempo de execução
Memoization
Armazena resultados de chamadas anteriores para reutilização
✅ Elimina recálculos repetidos de mesmos argumentos
Memoization (ou programação dinâmica top-down) é a técnica mais adequada para evitar recálculos repetidos. A ideia é criar um dicionário/array para armazenar o resultado de cada chamada com um argumento específico; antes de computar, verifica-se se o valor já foi calculado. Exemplo:
cache = {}
def fib(n):
if n in cache: return cache[n]
if n < 2: return n
cache[n] = fib(n-1) + fib(n-2)
return cache[n]
Alternativa B — ❌ Incorreta
Tail recursion optimization (otimização de recursão em cauda) é uma técnica aplicada por compiladores quando a chamada recursiva é a última operação da função. No Fibonacci clássico, a chamada recursiva não está em posição de cauda (são duas chamadas e uma soma), portanto a otimização não se aplica nem resolveria o problema de repetição de argumentos.
Alternativa C — ❌ Incorreta
Loop unrolling (desenrolamento de laços) é uma otimização de baixo nível que reduz o overhead de controle de loops, mas não ataca o problema de chamadas repetidas com mesmos argumentos. É irrelevante para algoritmos recursivos não iterativos.
Alternativa D — ❌ Incorreta
Branch prediction (predição de desvios) é uma técnica de hardware usada em pipelines de processadores para adivinhar o fluxo de execução de instruções condicionais. Não altera a lógica do algoritmo nem reduz chamadas redundantes.
Alternativa E — ❌ Incorreta
SIMD vectorization (vetorização SIMD) é uma técnica de paralelismo em nível de dados que processa múltiplos elementos simultaneamente usando instruções especiais. Não é aplicável a um algoritmo recursivo simples como Fibonacci, onde o gargalo é a repetição de chamadas, não o processamento de dados em lote.
PEGA ESSA DICA!
Ao identificar um algoritmo recursivo com repetição de cálculos (como Fibonacci), a primeira técnica a considerar é a memoization (programação dinâmica). Lembre-se de que tail recursion só ajuda se a chamada recursiva for a última operação da função e não houver múltiplas chamadas.