Médio C

Fatorial recursivo

Enunciado

Implemente uma função recursiva chamada fatorial que calcula o fatorial de um número inteiro não negativo. O main deve ler um inteiro n (0 ≤ n ≤ 12) e imprimir Fatorial de n = resultado.

Requisitos

  • A função fatorial deve ser recursiva (chamar a si mesma).
  • Deve tratar o caso base n <= 1 retornando 1.
  • O main deve ler n e imprimir a mensagem exata.

Código inicial

#include <stdio.h>

/* Protótipo da função fatorial */

int main(void) {
    int n;
    scanf("%d", &n);
    /* Chame a função e imprima */
    return 0;
}

/* Defina a função fatorial recursiva aqui */

Saída esperada

Fatorial de 5 = 120
Ver dica

A função chama a si mesma com n - 1 e multiplica pelo n atual. Não esqueça do caso base.

Mostrar solução
#include <stdio.h>

/* Protótipo da função fatorial */
int fatorial(int n);

int main(void) {
    int n;
    scanf("%d", &n);
    int resultado = fatorial(n);
    printf("Fatorial de %d = %d\n", n, resultado);
    return 0;
}

/* Definição recursiva do fatorial */
int fatorial(int n) {
    if (n <= 1) {
        return 1;          /* caso base: 0! = 1! = 1 */
    }
    return n * fatorial(n - 1); /* chamada recursiva */
}

Passo a passo

  1. O protótipo int fatorial(int n); declara a função antes do main.
  2. O main lê um inteiro n com scanf.
  3. Chama fatorial(n) e guarda o resultado.
  4. Imprime no formato pedido.
  5. A função fatorial verifica se n <= 1; se sim, retorna 1 (caso base).
  6. Caso contrário, retorna n * fatorial(n - 1), chamando a si mesma com um valor menor.

Por que funciona

A recursão funciona porque cada chamada reduz o problema: fatorial(5) chama fatorial(4), que chama fatorial(3), e assim por diante até fatorial(1), que retorna 1. As multiplicações são feitas na volta: 1 * 2 * 3 * 4 * 5 = 120. O caso base garante que a recursão pare.

Erros comuns

  • Esquecer o caso base: if (n <= 1) return 1; é essencial. Sem ele, a função chama a si mesma indefinidamente, causando stack overflow.
  • Chamar com n em vez de n - 1: return n * fatorial(n); nunca termina. Use fatorial(n - 1).
  • Tipo de retorno inadequado: para n até 12, int é suficiente; para valores maiores, use long long ou unsigned long long.

Outra forma de resolver

Versão iterativa (sem recursão):

int fatorial(int n) {
    int r = 1;
    for (int i = 2; i <= n; i++) r *= i;
    return r;
}

É preferível quando o desempenho é crítico ou a profundidade da recursão pode ser grande.

Saída esperada

Fatorial de 5 = 120