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
fatorialdeve ser recursiva (chamar a si mesma). - Deve tratar o caso base
n <= 1retornando 1. - O
maindeve lerne 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
- O protótipo
int fatorial(int n);declara a função antes domain. - O
mainlê um inteironcomscanf. - Chama
fatorial(n)e guarda o resultado. - Imprime no formato pedido.
- A função
fatorialverifica sen <= 1; se sim, retorna 1 (caso base). - 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
nem vez den - 1:return n * fatorial(n);nunca termina. Usefatorial(n - 1). - Tipo de retorno inadequado: para
naté 12,inté suficiente; para valores maiores, uselong longouunsigned 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