Algoritmos recursivos
Algoritmos recursivos são aqueles que resolvem um problema dividindo-o em subproblemas menores do mesmo tipo.
Cada subproblema é resolvido da mesma forma que o problema original até que o problema seja pequeno o suficiente para ser resolvido de forma direta. Em seguida, as soluções dos subproblemas são combinadas para resolver o problema original.
🎬 Vídeo
Características
- Chamada Recursiva: O algoritmo chama a si mesmo com argumentos diferentes.
- Condição de Parada: Há uma condição que termina a recursão, geralmente chamada de caso base.
Exemplos clássicos
Fibonacci
O problema de Fibonacci consiste em encontrar o n-ésimo número na sequência de Fibonacci, onde cada número é a soma dos dois números anteriores.
#include <stdio.h>
int fibonacci(int n) {
if (n <= 1) // Caso base
return n;
else
return fibonacci(n - 1) + fibonacci(n - 2); // Chamada recursiva
}
int main() {
int n = 5;
printf("O %dº número de Fibonacci é %d\n", n, fibonacci(n));
return 0;
}
Neste exemplo, fibonacci(n)
retorna o n-ésimo número de Fibonacci. Observe que:
- quando
n<=1
, o caso base é alcançado e o valor de n é retornado; - caso contrário, o valor é calculado recursivamente somando os resultados das chamadas
fibonacci(n - 1)
efibonacci(n - 2)
.
Como exemplo, a implementação iterativa seria:
int fib(int n) {
int ant, pen = 0, atual = 1;
if((n == 0) || (n == 1)) {
return n;
}
for(int i = 2; i <= n; i++) {
ant = pen;
pen = atual;
atual = ant + pen;
}
return atual;
}
Fatorial
O problema de fatorial consiste em encontrar o fatorial de um número, que é o produto de todos os números inteiros positivos de 1 até o número dado.
#include <stdio.h>
int fatorial(int n) {
if (n == 0) // Caso base
return 1;
else
return n * fatorial(n - 1); // Chamada recursiva
}
int main() {
int n = 5;
printf("O fatorial de %d é %d\n", n, fatorial(n));
return 0;
}
Neste exemplo, fatorial(n)
retorna o fatorial de n. Quando n==0
, o caso base é alcançado e 1 é retornado. Caso contrário, o fatorial é calculado multiplicando n pelo fatorial de n - 1
.
Esses exemplos ilustram como os algoritmos recursivos funcionam, dividindo problemas maiores em subproblemas menores até atingir um caso base e, em seguida, combinando as soluções dos subproblemas para obter a solução do problema original.