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.

Imagem ilustrativa.

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!

Veja também…

Loops em Java (for, while e do/while)