Introdução à Programação · 1.º ano (indicativo)
Como escrever um programa para o fatorial?
Resposta curta
O fatorial de n (n!) é o produto 1 × 2 × … × n, com 0! = 1. Em Python, comece com fat = 1, percorra for i in range(2, n + 1): e multiplique com fat *= i. No fim, print(fat) mostra o resultado. Para n = 5, o programa dá 120.
Quando se aplica
O fatorial aparece em Análise Combinatória (permutações, arranjos, combinações), em probabilidades e em séries. Em programação, é um dos exercícios clássicos de acumulador multiplicativo: tal como a soma começa em 0, o produto começa em 1, o elemento neutro da multiplicação.
Definição
- n! = 1 × 2 × 3 × … × n, para n inteiro positivo.
- 0! = 1, por convenção (é o que faz as fórmulas de combinações funcionarem).
- O fatorial não está definido para números negativos; o programa deve avisar o utilizador.
| n | n! |
|---|---|
| 0 | 1 |
| 1 | 1 |
| 3 | 6 |
| 5 | 120 |
| 6 | 720 |
| 10 | 3 628 800 |
Pré-requisitos
input()eint(); ciclosforcomrange; operador*=.- Em
range(2, n + 1)o limite superior é excluído, por isso o+ 1.
Método passo a passo
- Leia o valor:
n = int(input("n: ")). - Trate os casos inválidos: se
n < 0, mostre uma mensagem e não calcule. - Inicialize o acumulador a 1:
fat = 1. Se começasse em 0, o produto seria sempre 0. - Percorra de 2 a n:
for i in range(2, n + 1):. Começar em 2 basta, pois multiplicar por 1 não muda nada. - Multiplique dentro do ciclo:
fat *= i(recuado). - Mostre o resultado fora do ciclo:
print(fat).
Programa completo
n = int(input("n: "))if n < 0:- (recuada)
print("Fatorial não definido") else:- (recuada)
fat = 1 - (recuada)
for i in range(2, n + 1): - (recuada duas vezes)
fat *= i - (recuada)
print(n, "! =", fat)
Nota
O Python trabalha com inteiros de tamanho praticamente ilimitado, por isso 20! = 2 432 902 008 176 640 000 sai correto. Noutras linguagens (como C com int) o resultado transborda muito antes.
Exemplos resolvidos
Exemplo 1 — Fatorial de 5
Enunciado: Faça o rastreio do programa para n = 5.
Resolução:
fat = 1.- i = 2:
fat = 1 × 2 = 2. - i = 3:
fat = 2 × 3 = 6. - i = 4:
fat = 6 × 4 = 24. - i = 5:
fat = 24 × 5 = 120. O ciclo acaba (range chega a 5).
Resposta: mostra 5 ! = 120. Verificação: 1 × 2 × 3 × 4 × 5 = 120.
Exemplo 2 — Os casos 0 e 1
Enunciado: O que mostra o programa para n = 0 e para n = 1?
Resolução:
- Para n = 0:
range(2, 1)é vazio (começa em 2 e para antes de 1). O ciclo não executa efatfica com o valor inicial 1. - Para n = 1:
range(2, 2)também é vazio;fat = 1.
Resposta: em ambos os casos mostra 1. Verificação: coincide com 0! = 1 e 1! = 1, sem ser preciso tratar estes casos à parte.
Exemplo 3 — Versão com while
Enunciado: Reescreva o programa com while e calcule 4!.
Resolução:
fat = 1ei = 1.while i <= n:com n = 4.- Dentro:
fat *= iei += 1. - Rastreio: i = 1, fat = 1; i = 2, fat = 2; i = 3, fat = 6; i = 4, fat = 24; i passa a 5 e o ciclo termina.
Resposta: 24. Verificação: 4! = 4 × 3 × 2 × 1 = 24.
Exemplo 4 — Nível de exame: combinações com uma função
Enunciado: Escreva uma função fatorial(n) e use-a para calcular o número de maneiras de escolher 2 estudantes entre 5, C(5, 2) = 5! ÷ (2! × 3!).
Resolução:
- Defina a função:
def fatorial(n):com, recuados,r = 1,for i in range(2, n + 1):er *= i(mais recuado), ereturn r. - Calcule:
c = fatorial(5) // (fatorial(2) * fatorial(3)). O operador//é a divisão inteira, e aqui a divisão é exata. - Valores: fatorial(5) = 120, fatorial(2) = 2, fatorial(3) = 6; o denominador é 2 × 6 = 12.
- 120 ÷ 12 = 10.
Resposta: 10. Verificação: os pares possíveis entre 5 estudantes são 5 × 4 ÷ 2 = 10.
Erros frequentes
- **Inicializar
fat = 0.** Qualquer produto com 0 dá 0. O acumulador do produto começa em 1. - **Usar
range(1, n)ourange(2, n).** Perde-se o último fator n. O correto érange(2, n + 1). - Não tratar números negativos. Sem verificação, o programa devolve 1 para −3, o que é matematicamente errado.
- **Esquecer o
int()na leitura.** Com texto,range(2, n + 1)dáTypeError. - **Colocar o
printdentro do ciclo.** Mostra os fatoriais parciais (2, 6, 24, …) em vez de apenas o final. - Confundir n! com n × n ou com n × (n − 1) apenas. O fatorial multiplica todos os inteiros de 1 a n.
Exercícios propostos
1Exercício 1
Calcule, por rastreio, o resultado do programa para n = 4.
Ver solução
fat = 1; i = 2 dá 2; i = 3 dá 6; i = 4 dá 24. Mostra 24.
2Exercício 2
Qual é o resultado para n = 6? Confira com o valor de 5!.
Ver dica
6! = 6 × 5!.
Ver solução
Como 5! = 120, 6! = 6 × 120 = 720. O ciclo faz mais uma volta (i = 6) em relação ao caso de n = 5.
3Exercício 3
Escreva um programa que calcule 1! + 2! + 3! + 4! e indique o resultado.
Ver solução
soma = 0; fat = 1; for i in range(1, 5): com fat *= i e soma += fat (recuados). Valores de fat: 1, 2, 6, 24, e a soma é 1 + 2 + 6 + 24 = 33.
4Exercício 4
Escreva um programa que descubra o menor n tal que n! > 1000.
Ver dica
Use while e multiplique até o produto ultrapassar 1000.
Ver solução
n = 1; fat = 1; while fat <= 1000: com n += 1 e fat *= n recuados; print(n). Rastreio: 5! = 120, 6! = 720 (ainda ≤ 1000), 7! = 5040 (> 1000). O resultado é n = 7.
5Exercício 5
De quantas maneiras diferentes podem 4 estudantes sentar-se em 4 cadeiras alinhadas? Calcule com o programa.
Ver solução
O número de permutações de 4 elementos é 4! = 4 × 3 × 2 × 1 = 24. É o resultado que o programa dá para n = 4.
Perguntas frequentes
Quando se usa este método?
Sempre que precisa de multiplicar todos os inteiros de 1 até n. Em combinatória, para permutações e combinações; em séries, nos denominadores de termos como 1/n!.
Existe um método mais rápido?
Sim: o módulo math do Python tem math.factorial(n), que dá o resultado diretamente. Mas em disciplinas de introdução pede-se normalmente o ciclo, porque é ele que treina o acumulador.
Posso calcular o fatorial com recursão?
Sim. Uma função que devolve n * fatorial(n - 1), com caso-base n <= 1, também funciona. É um tópico posterior; confirme no programa da sua disciplina se já faz parte da matéria.
Que erros são mais comuns?
Acumulador a 0, limite do range sem o + 1 e esquecer os negativos. Veja a secção «Erros frequentes».
Resumo
- n! = 1 × 2 × … × n, e 0! = 1; não existe para negativos.
- O acumulador do produto começa em 1, não em 0.
for i in range(2, n + 1): fat *= icalcula o fatorial.- Para n = 0 e n = 1 o ciclo não executa e o resultado 1 sai certo.
- 5! = 120, 6! = 720, 10! = 3 628 800.
math.factorialexiste, mas o ciclo é o exercício de aprendizagem.
Onde aprofundar
- O programa da disciplina de Introdução à Programação da sua instituição — confirme a bibliografia em vigor.
- A documentação oficial do Python, nas secções sobre
for,rangee o módulomath. - O curso CS50 (Harvard), como referência pedagógica, em inglês.
Continue a estudar
Como escrever um programa para a tabuada?
Leia o número com n = int(input()) e percorra os multiplicadores de 1 a 10 com for i in range(1, 11):. Dentro do ciclo, mostre cada linha com print(n, "x", i, "=", n *…
4 exemplos5 exercícios com solução✓ Estudado
Como escrever um programa para a sequência de Fibonacci?
A sequência de Fibonacci começa em 0 e 1, e cada termo seguinte é a soma dos dois anteriores: 0, 1, 1, 2, 3, 5, 8, … Em Python, guarde os dois últimos termos em a e b…
4 exemplos5 exercícios com solução✓ Estudado
Como escrever um programa para somar números até zero?
Em Python, use um acumulador total = 0, leia o primeiro número e repita com while n != 0: somando n ao total e lendo o número seguinte dentro do ciclo. O zero funciona…
4 exemplos5 exercícios com solução✓ Estudado
Qual é a diferença entre while e for?
O for percorre uma sequência ou repete um número de vezes conhecido à partida. O while repete enquanto uma condição for verdadeira, por isso serve quando não se sabe…
4 exemplos5 exercícios com solução✓ Estudado
Ver tudo de Introdução à Programação · Capítulo: Estruturas de repetição