Questão 7: Crie uma função fatorial (n) que receba um número
e retorne o seu fatorial (ex:
). Use um laço while.
Exemplo: fatorial (5) deve retornar 120.
Passo 1
O enunciado pede que eu crie uma função chamada e retorne o fatorial de
. O enunciado dá como exemplo que
e que . Informações relevantes fornecidas:
fatorial(n) que receba um número
fatorial(5) deve retornar
- A função deve chamar-se
fatoriale aceitar um parâmetro, aqui chamado. - A operação pedida é o fatorial: produto dos inteiros positivos até
. - É obrigatório usar um laço
while. - Exemplo:
fatorial(5)→.
Observação que vou assumir (pois o enunciado não trata casos raros):
é um inteiro não-negativo (
).
Passo 2
O que é fatorial? Definição e regra básica:
- Para todo inteiro
,
- Por convenção, o fatorial de zero é
Explicação intuitiva: o fatorial é um produto acumulado. Se eu quero
, multiplico
por
, depois por
, e assim por diante até
. Para
não há nenhum número para multiplicar, então adotamos
para manter propriedades combinatórias e algébricas consistentes.
Passo 3
Estratégia para implementar com
while (sem resolver ainda): vamos manter uma variável que guarda o produto acumulado (vou chamar de resultado) e um contador que percorre os multiplicadores. Cada iteração do while multiplica resultado pelo valor atual do contador e depois atualiza o contador até que a condição de término seja atingida. Essa é uma abordagem iterativa direta e fácil de executar na prova sem complicação.Passo 4
Escolha do sentido do laço e inicializações (detalhe prático): duas opções comuns
- Decrementar: começar com um contador
e enquanto fazer resultado = resultado * iei = i - 1. - Incrementar: começar com
e enquanto fazer resultado = resultado * iei = i + 1.
Vou usar a opção de decrementar (contador começando em
) porque é ligeiramente mais intuitiva aqui: não precisamos testar .
i <= n (já inicializado) e o laço termina quando chegamos a
Passo 5
Explicação passo a passo das variáveis que usaremos:
né o parâmetro de entrada, o inteiro cujo fatorial queremos.resultadoarmazena o produto acumulado; inicializamos comporque é o elemento neutro da multiplicação (multiplicar por não altera o produto). iserá o contador que começa emne vai decrescendo até.
Fluxo do algoritmo:
- Se desejarmos, validar que
né inteiro en >= 0(opcional, mas recomendado). - Inicializar
resultado = 1. - Inicializar
i = n. - Enquanto
i > 1, fazer:resultado = resultado * ii = i - 1
- Quando o laço terminar,
resultadocontém. Retornar resultado.
Passo 6
Vou demonstrar com o exemplo
(passo a passo das iterações). Inicialmente:
resultado = 1,i = 5.
Iterações (cada linha mostra o par
depois de executar o corpo do laço naquela iteração):
- Iteração 1: antes:
. Executa resultado *= 5→resultado = 5. Depoisi -= 1→i = 4. Agora. - Iteração 2: antes:
. resultado *= 4→resultado = 20.i = 3. Agora. - Iteração 3: antes:
. resultado *= 3→resultado = 60.i = 2. Agora. - Iteração 4: antes:
. resultado *= 2→resultado = 120.i = 1. Agora. - O laço para porque
i > 1já não é verdade. Retornamosresultado = 120.
Portanto, para
o algoritmo devolve
, como exigido.
Passo 7
Complexidade e cuidados rápidos (útil na prova):
- Tempo: a rotina faz aproximadamente
multiplicações para , então é . - Memória: usa um número fixo de variáveis auxiliares, então é
. - Casos especiais: se
o código acima retorna corretamente. Se nfor negativo ou não inteiro, o fatorial clássico não está definido; numa implementação prática devemos tratar isso (lançar erro ou converter explicitamente), mas como o enunciado pressupõe umapropriado, manteremos a exigência de inteiro não-negativo.
Passo 8
Código final da função em Python (usa
while e segue exatamente a lógica acima):def fatorial(n):
if not isinstance(n, int):
raise TypeError(“n deve ser inteiro”)
if n < 0:
raise ValueError(“n deve ser não-negativo”)
resultado = 1
i = n
while i > 1:
resultado *= i
i -= 1
return resultado
if not isinstance(n, int):
raise TypeError(“n deve ser inteiro”)
if n < 0:
raise ValueError(“n deve ser não-negativo”)
resultado = 1
i = n
while i > 1:
resultado *= i
i -= 1
return resultado
Resposta
def fatorial(n):
if not isinstance(n, int):
raise TypeError(“n deve ser inteiro”)
if n < 0:
raise ValueError(“n deve ser não-negativo”)
resultado = 1
i = n
while i > 1:
resultado *= i
i -= 1
return resultado
if not isinstance(n, int):
raise TypeError(“n deve ser inteiro”)
if n < 0:
raise ValueError(“n deve ser não-negativo”)
resultado = 1
i = n
while i > 1:
resultado *= i
i -= 1
return resultado