Recursividade em PHP: Entenda Funções Recursivas Passo a Passo
Existe uma velha piada entre os programadores que diz: "Para entender a recursividade, você primeiro precisa entender a recursividade". Ao final deste tutorial do nosso Curso de PHP, você vai entender exatamente o que isso significa (e vai rir junto!).
Uma função recursiva é, nada mais, nada menos, do que uma função que invoca (chama) a si mesma de dentro do seu próprio bloco de código. É um conceito lindo, matemático e extremamente poderoso na programação.
⚠️ Cuidado com o Loop Infinito (Stack Overflow)
Obviamente, se você apenas escrever o código da função chamando a si mesma, a função de dentro chamará a si mesma, que chamará a si mesma de novo, infinitamente... até esgotar toda a memória RAM do computador ou do servidor.
Para evitar que isso aconteça, toda função recursiva deve, obrigatoriamente, ter um ponto de parada (Base Case). Isso é feito com um simples if/else. Se a condição de parada for atingida, a função para de se invocar; caso contrário, ela continua.
1. Somatório com Recursão
Seja $F(n)$ uma função matemática que representa o somatório de um número $n$. Ou seja, é a soma de todos os números até ele:
$$F(n) = 1 + 2 + 3 + 4 + \dots + (n-1) + n$$Por exemplo:
$F(4) = 1 + 2 + 3 + 4 = 10$
$F(5) = 1 + 2 + 3 + 4 + 5 = 15$
Porém, note um padrão interessante na matemática. A soma de 5 é exatamente a soma de 4, mais 5:
$F(5) = (1 + 2 + 3 + 4) + 5 = F(4) + 5$
Isso nos dá a nossa fórmula recursiva universal: $F(n) = n + F(n-1)$
A Lógica: Vamos criar uma função somatorio(). Se o argumento for 1 (nosso ponto de parada), ela retorna 1 e o programa acaba. Se não for 1, ela retorna $n$ mais a chamada da própria função para $n-1$.
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Somatório Recursivo - PHP</title>
</head>
<body style="font-family: Arial; padding: 20px;">
<form action="" method="get">
Somatório de: <input type="number" name="numero" required />
<input type="submit" value="Calcular" />
</form>
<?php
if (isset($_GET['numero'])) {
$numero = intval($_GET['numero']);
echo "<br><strong>O somatório de {$numero} é:</strong> " . somatorio($numero);
}
// Função Recursiva
function somatorio($numero) {
// Ponto de Parada
if ($numero == 1) {
return 1;
} else {
// Chamada Recursiva
return $numero + somatorio($numero - 1);
}
}
?>
</body>
</html>
2. Fatorial com Recursão ($n!$)
O Fatorial segue uma lógica absurdamente parecida com a do somatório, mas multiplicando. (Nós já o calculamos usando Laços de Repetição no passado).
Observe:
$5! = 5 \times 4 \times 3 \times 2 \times 1$
$6! = 6 \times (5 \times 4 \times 3 \times 2 \times 1) = 6 \times 5!$
A nossa fórmula recursiva é: $n! = n \times (n-1)!$
O nosso ponto de parada baseia-se na regra matemática universal de que $0! = 1$. Veja o código:
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Fatorial Recursivo - PHP</title>
</head>
<body style="font-family: Arial; padding: 20px;">
<form action="" method="get">
Fatorial de: <input type="number" name="numero" min="0" required />
<input type="submit" value="Calcular Fatorial" />
</form>
<?php
if (isset($_GET['numero'])) {
$numero = intval($_GET['numero']);
echo "<br><strong>O fatorial de {$numero} é:</strong> " . fat($numero);
}
// Função Recursiva
function fat($numero) {
// Ponto de Parada
if ($numero == 0) {
return 1;
} else {
// Chamada Recursiva
return $numero * fat($numero - 1);
}
}
?>
</body>
</html>
3. Sequência de Fibonacci com Recursão
A famosa série de Fibonacci é um dos exemplos mais clássicos ensinados nas universidades para treinar recursividade. Na matemática da natureza, os primeiros termos são definidos como:
$F(0) = 0$
$F(1) = 1$
A partir daí, cada novo número é a soma dos dois anteriores. A fórmula recursiva é:
$F(n) = F(n-1) + F(n-2)$
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Fibonacci Recursivo - PHP</title>
</head>
<body style="font-family: Arial; padding: 20px;">
<form action="" method="get">
Exibir o Termo Fibonacci (N): <input type="number" name="numero" min="0" required />
<input type="submit" value="Descobrir" />
</form>
<?php
if (isset($_GET['numero'])) {
$numero = intval($_GET['numero']);
echo "<br><strong>O termo {$numero} de Fibonacci é:</strong> " . fibo($numero);
}
// Função Recursiva
function fibo($numero) {
// Pontos de Parada
if ($numero == 0 || $numero == 1) {
return $numero;
} else {
// Chamada Recursiva Dupla
return fibo($numero - 1) + fibo($numero - 2);
}
}
?>
</body>
</html>
Domine Algoritmos no PHP 🧠
Recursividade é apenas o começo! O verdadeiro poder de um desenvolvedor está em conhecer todas as ferramentas da linguagem. Estude com centenas de exercícios práticos, gabaritados e organizados do zero ao avançado.
Baixar Apostila Completa de PHP
Nenhum comentário:
Postar um comentário