⚡ Cap 09: Recursividade & Pilha de Execução
Especialização em Engenharia de Sistemas com Linguagem C (C17/C23)
🗺️ Slide 1: Os 2 Pilares Obrigatórios da Recursão
graph LR
A["1. Caso Base\n(Condição de Parada)"] --> B["2. Passo Recursivo\n(Convergência n - 1)"]
style A fill:#059669,stroke:#34d399,color:#ffffff
style B fill:#7c3aed,stroke:#c084fc,color:#ffffff
- Caso Base: Resposta direta que interrompe a cadeia de chamadas.
- Passo Recursivo: Invocação da própria função sobre uma fração menor do problema.
🥞 Slide 2: Ciclo de Vida na Call Stack
sequenceDiagram
participant Main as main()
participant F3 as fat(3)
participant F2 as fat(2)
participant F1 as fat(1)
participant F0 as fat(0)
Main->>F3: Chama fat(3)
F3->>F2: Chama fat(2)
F2->>F1: Chama fat(1)
F1->>F0: Chama fat(0)
Note over F0: CASO BASE: Retorna 1
F0-->>F1: 1 * 1 = 1
F1-->>F2: 2 * 1 = 2
F2-->>F3: 3 * 2 = 6
F3-->>Main: Resultado final 6
- Fase 1: Winding (Empilhamento) $\rightarrow$ Fase 2: Unwinding (Resolução e Desempilhamento).
⚠️ Slide 3: O Perigo de Stack Overflow
- A memória Stack de um processo possui tamanho fixo (1 MB a 8 MB).
- Recursões sem caso base ou com profundidade extrema esgotam a memória, gerando
SIGSEGV(Segmentation Fault).
⚡ Slide 4: Recursão de Cauda (Tail Call Optimization)
// O resultado é transportado no acumulador
uint64_t fat_tail(int n, uint64_t acc) {
if (n <= 1) return acc;
return fat_tail(n - 1, n * acc); // Última instrução pura
}
- Com a flag
-O2, o compilador transforma a recursão em salto $O(1)$ sem custo adicional de Stack.
📋 Resumo da Aula & Próximos Passos
- Revise os códigos de exemplo deste capítulo.
- Teste seus conhecimentos no Quiz Formativo.
- Pratique os exercícios em 4 níveis de complexidade.
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim