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;
}