1
resposta

Dúvida de como funciona a chama da função dentro dela mesmo

Alguém poderia me detalhar como funciona cada passo desse código:

function fatorial(n) {
    if (n == 1) {
        return 1
    } else {
        return n * fatorial(n-1)
    }
}

console.log(fatorial(5));

Eu ainda não entendi como ele consegue retornar o resultado correto

1 resposta

Oi Thiago, tudo bem com você?

Peço desculpas pela demora em obter um retorno.

Vamos começar pela teoria: essa função apresentada é uma função recursiva. E o que isso quer dizer? Isso significa que essa função chama a si mesma até que seja interrompida através de uma condição. Já em relação ao conceito de números fatoriais é importante saber que, matematicamente falando, os números 1 e 0 não precisam ser calculados pois o resultado sempre será igual a 1.

O fatorial do número 5 é calculado pela seguinte fórmula:

5! = 5*4*3*2*1 

Resultado: 120

De forma geral, a função para qualquer número maior que 1 é:

n! = n * (n-1) * (n-2) * (n-3) * ....... * 1

Partindo para o código, temos uma condição a qual chamamos de ponto de parada, pois quando o valor de n atinge o valor 1, paramos de invocar a função e retornarmos o valor 1 para a pilha de execução da função:

// Ponto de Parada: quando n é igual a 1
 if (n == 1) {
        return 1
    } 

Já em relação a chamada recursiva, quando invocamos n * fatorial(n-1) teremos uma chamada similar à apresentada abaixo:

  • 5 * fatorial(5-1) => 5 * fatorial(4) // que resulta em 120
  • 4 * fatorial(4-1) => 4 * fatorial(3) // que resulta em 24
  • 3 * fatorial(3-1) => 3 * fatorial(2) // que resulta em 6
  • 2 * fatorial(2-1) => 2 * fatorial(1) // que resulta em 2
  • fatorial(1) = 1 => Agora temos que N vale 1, então, atingimos nossa condição de parada, onde o valor 1 é retornado.

Como atingimos a condição de parada, por padrão, nosso código irá começar a desempilhar as chamadas recursivas (de baixo para cima), substituindo os valores, uma vez que o código saberá que o fatorial de 1 é 1, o fatorial de 2 é 2, o fatorial de 3 é 6 e assim por diante. E ao chegar na última chamada, ou seja, o valor de 5 fatorial, ele já terá o valor do fatorial de 4 calculado pelos fatoriais anteriores, e o computador retornará o resultado para a função principal, que é 120.

Como recomendação, deixo a aula de fatorial recursivo, do curso de Maratona de programação: algoritmos para a competição, nela, o instrutor explica passo a passo como construir uma função recursiva e a lógica por trás da mesma. O código é feito na linguagem C, mas a lógica se aplica para qualquer linguagem.

Em caso de mais dúvidas, me coloco à disposição.

Grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!