💻 Exemplos de Código: Cap 09 - Recursividade e Call Stack
Código executável completo demonstrando rastreamento de pilha de execução com profundidade, resolução das Torres de Hanói e otimização por Recursão de Cauda (TCO).
📄 Exemplo 1: Rastreando a Call Stack em Fatorial (stack_trace_demo.c)
#include <stdio.h>
#include <stdint.h>
// Função que imprime identação visual de acordo com a profundidade da Stack
void imprimirIndentacao(int nivel) {
for (int i = 0; i < nivel; i++) {
printf(" │ ");
}
}
uint64_t fatorialVisual(uint32_t n, int nivel) {
imprimirIndentacao(nivel);
printf("┌──> [CALL] Entrando em fatorial(%u) [Stack Frame #%d]\n", n, nivel);
// 1. Caso Base
if (n == 0 || n == 1) {
imprimirIndentacao(nivel);
printf("└─── [BASE] Caso Base atingido! Retornando 1.\n");
return 1;
}
// 2. Passo Recursivo
uint64_t resultadoParcial = fatorialVisual(n - 1, nivel + 1);
uint64_t resultadoFinal = n * resultadoParcial;
imprimirIndentacao(nivel);
printf("└─── [RET] Resolvendo %u * %llu = %llu [Liberando Frame #%d]\n",
n, resultadoParcial, resultadoFinal, nivel);
return resultadoFinal;
}
int main(void) {
printf("====================================================\n");
printf(" 🥞 RASTREAMENTO VISUAL DA CALL STACK EM RECURSAO\n");
printf("====================================================\n");
uint32_t num = 4;
uint64_t resultado = fatorialVisual(num, 0);
printf("----------------------------------------------------\n");
printf(" Resultado Final de %u! = %llu\n", num, resultado);
printf("====================================================\n");
return 0;
}
📄 Exemplo 2: Resolução das Torres de Hanói (hanoi.c)
#include <stdio.h>
#include <stdint.h>
static uint32_t totalMovimentos = 0;
void moverTorres(int n, char origem, char destino, char auxiliar) {
if (n == 1) {
totalMovimentos++;
printf("Passo %02u: Mover disco 1 de [%c] para [%c]\n", totalMovimentos, origem, destino);
return;
}
// 1. Move n-1 discos da Origem para o Auxiliar
moverTorres(n - 1, origem, auxiliar, destino);
// 2. Move o maior disco para o Destino
totalMovimentos++;
printf("Passo %02u: Mover disco %d de [%c] para [%c]\n", totalMovimentos, n, origem, destino);
// 3. Move n-1 discos do Auxiliar para o Destino
moverTorres(n - 1, auxiliar, destino, origem);
}
int main(void) {
int discos = 3;
printf("====================================================\n");
printf(" 🏯 SOLUCAO RECURSIVA DAS TORRES DE HANOI (%d DISCOS)\n", discos);
printf("====================================================\n");
moverTorres(discos, 'A', 'C', 'B');
printf("----------------------------------------------------\n");
printf(" Total de Movimentos Executados: %u (Teorico 2^N - 1 = %d)\n",
totalMovimentos, (1 << discos) - 1);
printf("====================================================\n");
return 0;
}