Introdução à Programação · 1.º ano (indicativo)

Como escrever um programa para o fatorial?

  • 7 min de leitura
  • 4 exemplos resolvidos
  • 5 exercícios com solução
  • Atualizado em

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.
nn!
01
11
36
5120
6720
103 628 800

Pré-requisitos

  • input() e int(); ciclos for com range; operador *=.
  • Em range(2, n + 1) o limite superior é excluído, por isso o + 1.

Método passo a passo

  1. Leia o valor: n = int(input("n: ")).
  2. Trate os casos inválidos: se n < 0, mostre uma mensagem e não calcule.
  3. Inicialize o acumulador a 1: fat = 1. Se começasse em 0, o produto seria sempre 0.
  4. 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.
  5. Multiplique dentro do ciclo: fat *= i (recuado).
  6. Mostre o resultado fora do ciclo: print(fat).

Programa completo

  1. n = int(input("n: "))
  2. if n < 0:
  3. (recuada) print("Fatorial não definido")
  4. else:
  5. (recuada) fat = 1
  6. (recuada) for i in range(2, n + 1):
  7. (recuada duas vezes) fat *= i
  8. (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:

  1. fat = 1.
  2. i = 2: fat = 1 × 2 = 2.
  3. i = 3: fat = 2 × 3 = 6.
  4. i = 4: fat = 6 × 4 = 24.
  5. 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:

  1. Para n = 0: range(2, 1) é vazio (começa em 2 e para antes de 1). O ciclo não executa e fat fica com o valor inicial 1.
  2. 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:

  1. fat = 1 e i = 1.
  2. while i <= n: com n = 4.
  3. Dentro: fat *= i e i += 1.
  4. 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:

  1. Defina a função: def fatorial(n): com, recuados, r = 1, for i in range(2, n + 1): e r *= i (mais recuado), e return r.
  2. Calcule: c = fatorial(5) // (fatorial(2) * fatorial(3)). O operador // é a divisão inteira, e aqui a divisão é exata.
  3. Valores: fatorial(5) = 120, fatorial(2) = 2, fatorial(3) = 6; o denominador é 2 × 6 = 12.
  4. 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) ou range(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 print dentro 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

Tente resolver primeiro no caderno; depois confira.

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 *= i calcula 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.factorial existe, 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, range e o módulo math.
  • O curso CS50 (Harvard), como referência pedagógica, em inglês.

Continue a estudar

1.º ano (indicativo)8 min

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

1.º ano (indicativo)8 min

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

1.º ano (indicativo)8 min

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

1.º ano (indicativo)9 min

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

Ver tudo de Introdução à Programação · Capítulo: Estruturas de repetição