Texto de: Cristina Leandro
Conceito
De forma bem resumida, recursividade é o ato de chamar a si mesmo. Uma função recursiva é uma função que se chamará até uma determinada condição se cumpra.
Sintaxe
Você pode escrever a uma função recursiva em JavaScript assim:
function recursao() {
// código da função
recursao();
//chamada da função dentro da própria função
}
recursao();
Dessa forma, a função recursao()
irá chamar a si mesma. Nesse caso, não especificamos a condição que a função deve atingir, ou seja, acabamos de criar uma função com loop infinito e para evitar que a função caia nesse loop devemos escrever uma condição de parada.
Uma forma interessante de especificar essa condição é usando a estrutura de controle if/else
, veremos abaixo como fica:
function recursao() {
if(condição) {
recursao();
}
else {
//aqui a função recursao() é parada de ser chamada
}
}
recursao();
Então, agora ainda temos uma função que chamará ela mesma, mas quando a condição é cumprida ela sairá do loop de continuar se chamando e se chamando, e se chamando, e se chamando…
Exemplo
Agora, veremos como a recursão funciona na prática. Um exemplo bacana para consolidar o conceito é de uma função que calcula o fatorial de um número.
Na matemática, se calcula o fatorial multiplicando um número por todos os seus antecessores até chegar ao número 1, por exemplo:
1! = 1
2! = 2 * 1 = 2
3! = 3 * 2 * 1 = 6
4! = 4 * 3 * 2 * 1 = 24
5! = 5 * 4 * 3 * 2 * 1 = 120
Abaixo, usaremos uma função recursiva para fazer esse cálculo:
function fatorial(numero){ //criando a função fatorial
//especificando a condição de "se o número for zero o programa retornará 1."
if (numero == 0){
return 1
} else { //Se o número for maior que 0...
return numero * fatorial(numero -1)// o programa chamará a si mesmo recursivamente diminuindo o número.
}
}
Ao chamar a função na linha de baixo, teremos o resultado esperado:
console.log(fatorial(5))
//output: 120
Confusão
Não se deve confundir uma recursão com loops ou laços de repetição como for, while, do/while…, etc. A recursão é um mecanismo para chamar uma função dentro da mesma função e o loop é uma estrutura de controle que permite executar um bloco de código com um conjunto de instruções várias vezes.
Enquanto na função recursiva uma instrução condicional é necessária no corpo da função apenas para interromper a execução, em um laço, a própria sintaxe dessa estrutura de repetição contém instruções para interromper a iteração. Um exemplo usando while:
while (condição) {
// código para ser executado
}
No laço, a condição de parada já é premeditada pela sintaxe da estrutura. A cada execução, a condição é verificada. Já a função recursiva, como visto anteriormente nesse artigo, pode ser escrita sem a instrução condicional. Isso não gerará nenhuma mensagem de erro, mas isso não significa que você deve estruturar sua função assim, pois isso fará com que sua função entrar em um loop infinito, o que não é nada legal.
Bônus: Exercícios práticos
Essa sessão conta com três exercícios relacionados ao tema para que você possa praticar e assim consolidar esse conceito:
01: Crie uma função recursiva para calcular o n-ésimo termo da sequência de Fibonacci.
02: Crie uma função recursiva que faz uma contagem regressiva a partir de um número n
até 0.
03: Crie uma função recursiva que calcula a soma dos números naturais de 1 a n
, por exemplo, a soma de 1 a 5 é 15.
Conclusão
Nesse artigo entendemos o conceito e a prática da recursividade, vimos alguns exemplos e entendemos que não devemos confundir a recursão com estruturas de laços de repetição. Esse é um erro comum entre iniciantes e ocorre pela complexidade do conceito da recursão, portanto, devemos nos atentar aos detalhes.