Otimização de Recursão
Técnicas de Otimização para Funções Recursivas
// Recursão não otimizada
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
// Otimização de recursão em cauda
int optimized_factorial(int n, int accumulator) {
if (n <= 1) return accumulator;
return optimized_factorial(n - 1, n * accumulator);
}
Estratégias de Otimização de Recursão
graph TD
A[Otimização de Recursão] --> B[Recursão em Cauda]
A --> C[Memorização]
A --> D[Conversão Iterativa]
A --> E[Limitação de Profundidade]
2. Técnica de Memorização
#define MAX_CACHE 100
int fibonacci_memo(int n) {
static int cache[MAX_CACHE] = {0};
if (n <= 1) return n;
if (cache[n] != 0) return cache[n];
cache[n] = fibonacci_memo(n-1) + fibonacci_memo(n-2);
return cache[n];
}
Comparação de Otimização
| Técnica |
Uso de Memória |
Complexidade de Tempo |
Legibilidade |
| Recursão Básica |
Alta |
O(2^n) |
Boa |
| Recursão em Cauda |
Baixa |
O(n) |
Excelente |
| Memorização |
Moderada |
O(n) |
Boa |
| Iterativa |
Baixa |
O(n) |
Melhor |
3. Conversão Iterativa
// Abordagem recursiva
int recursive_sum(int n) {
if (n <= 0) return 0;
return n + recursive_sum(n - 1);
}
// Equivalente iterativo
int iterative_sum(int n) {
int total = 0;
for (int i = 1; i <= n; i++) {
total += i;
}
return total;
}
Flags de Otimização do Compilador
## Compile com flags de otimização
gcc -O2 -march=native recursion_optimization.c
4. Técnica de Limitação de Profundidade
int safe_recursive_function(int n, int max_depth) {
if (max_depth <= 0) return 0;
if (n <= 1) return n;
return safe_recursive_function(n-1, max_depth-1) +
safe_recursive_function(n-2, max_depth-1);
}
Considerações Avançadas de Otimização
- Utilize flags de otimização do compilador.
- Prefira recursão em cauda.
- Implemente memorização para cálculos repetitivos.
- Converta para iteração quando possível.
No LabEx, recomendamos a seleção cuidadosa de técnicas de otimização com base nas necessidades específicas do problema e nas restrições do sistema.