Recursão – pilha de chamadas e árvore de chamadas
ComputaçãoAlgoritmos e resolução de problemasIdades 17–18
Carregando…
Entre para usarExecute passo a passo funções recursivas – fatorial, Fibonacci, soma de uma lista, busca binária, o quebra-cabeça da torre de discos e ordenação por intercalação – e veja a pilha de chamadas crescer e esvaziar enquanto uma árvore registra cada chamada, cada caso base e cada valor retornado. Compare o Fibonacci recursivo simples com a memoização e com um laço, retire o caso base para causar um estouro de pilha e leia o código em Python ou pseudocódigo.
Aula: Recursão: caso base, pilha de chamadas, dividir para conquistar, memoização, recursão versus iteração
O que mostra
Uma função recursiva resolve um problema chamando a si mesma com uma versão menor do mesmo problema. Cada chamada empilha um novo quadro na pilha de chamadas; o caso base retorna sem chamar de novo, e então os quadros são desempilhados enquanto os valores sobem. A árvore de chamadas mostra todas as chamadas: o fatorial e a soma de lista formam uma única cadeia, enquanto Fibonacci, a ordenação por intercalação e a torre se ramificam. O Fibonacci simples repete as mesmas chamadas, e o número delas cresce exponencialmente; a memoização guarda os resultados. Sem caso base, a pilha estoura.
Como usar
Escolha uma Função e ajuste n (ou o Alvo na busca binária). Clique em Passo para fazer uma chamada ou um retorno de cada vez, Voltar para desfazer um passo ou Executar para reproduzir na Velocidade escolhida. Observe o código, a pilha e a árvore; toque em um nó para ver detalhes. Marque Memo no Fibonacci ou desmarque Com caso base para ver um estouro de pilha.
Parâmetros que você pode mudar
- Função recursiva Fatorial n!, Números de Fibonacci, Soma de uma lista, Busca binária, Torre de discos (quebra-cabeça), Ordenação por intercalação
- n (tamanho do problema) 0–8
- Valor procurado (busca binária) 0–100
- Memoização (Fibonacci)
- Incluir o caso base
- Linguagem Python, Pseudocódigo
- Velocidade 0,5–10 passos/s
Perguntas para explorar
- Quantas vezes fib(2) é chamada ao calcular fib(6) sem memoização, e quantas vezes com ela?
- Qual é a profundidade máxima da pilha para factorial(5), e quanta pilha a versão com laço precisa?
- Por que retirar o caso base causa um estouro de pilha e não uma resposta errada?