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!