Você já deve ter ouvido a palavra recursão e/ou recursividade na sua jornada de desenvolvimento na programação. Mas se ainda não ouviu, fica tranquilo, ainda irá ouvir bastante.
Recursividade é um conceito muito importante, mas, que de início, pode ser um pouco confuso de entender. E é sobre isso que vamos falar no decorrer deste artigo. Vamos lá?
Conceito
De forma bem resumida, recursividade é o ato de chamar a si mesmo. Uma função recursiva é uma função que se chamará até que se cumpra uma determinada condição.
Sintaxe
Você pode escrever a sintaxe de 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 ela 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.
É muito importante, ao trabalhar com recursão, escrever a condição de parada para que sua função não caia nesse loop.
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, vamos dar uma olhada em 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
if (numero == 0){ //especificando a condição de "se o número for zero o programa retornará 1."
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 diferença importante de notar entre recursão e loop é que a recursão é um mecanismo para chamar uma função dentro da mesma função, enquanto o loop é uma estrutura de controle que permite executar um bloco de código com um conjunto de instruções repetidas vezes dentro de um programa até que a condição dada seja verdadeira.
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
}
A condição de parada já é premeditada pela sintaxe da estrutura. A cada execução, a condição é verificada.
Na função recursiva, como visto anteriormente nesse artigo, você consegue escrevê-la sem a instrução condicional. É possível e você não terá nenhuma mensagem de erro. Mas, você claramente não deve, pois, como eu disse anteriormente, sua função entrará em um loop infinito, o que não é nada legal.
Conclusão
Nesse artigo entendemos o conceito e a prática da recursividade, vimos alguns exemplos e entendemos que não se deve confundir e associar com estruturas de laços de repetição, erro comum entre iniciantes e que ocorre pela complexidade do conceito da recursão. Portanto, devemos nos atentar aos detalhes.
Espero que vocês tenham gostado desse artigo e até a próxima!