Como faço para calcular um fatorial de um número inteiro em Python?
135
A maneira mais fácil é usar math.factorial
(disponível no Python 2.6 e acima):
import math
math.factorial(1000)
Se você quiser / tiver que escrever você mesmo, poderá usar uma abordagem iterativa:
def factorial(n):
fact = 1
for num in range(2, n + 1):
fact *= num
return fact
ou uma abordagem recursiva :
def factorial(n):
if n < 2:
return 1
else:
return n * factorial(n-1)
Observe que a função fatorial é definida apenas para números inteiros positivos; portanto, você também deve verificar isso n >= 0
e aquilo isinstance(n, int)
. Caso contrário, aumente um ValueError
ou um, TypeError
respectivamente. math.factorial
vai cuidar disso para você.
factorial
dentro dafactorial
função. Como você pode usar a mesma função na função que está definindo atualmente? Eu sou novo no Python, então só estou tentando entender.RecursionError
para qualquer número maior que 998 (tentativafactorial(999)
), a menos que você aumente o limite de recursão do PythonNo Python 2.6 e superior, tente:
fonte
float
para esta função aumentará aDeprecationWarning
. Se você quiser fazer isso, precisará convertern
para umint
explicitamente:,math.factorial(int(n))
que descartará qualquer coisa após o decimal, para que você possa verificar isso:n.is_integer()
Não é realmente necessário, pois esse é um tópico tão antigo. Mas eu fiz aqui é outra maneira de calcular o fatorial de um número inteiro usando um loop while.
fonte
num = num * n
posição da linha comn = n - 1
e executo issofor i in range(1, 5): print('Factorial of', i, 'is', factorial(i))
Para cada fatorial, o resultado é 0. Gostaria de saber o raciocínio do porquênum = num * n
precisa vir primeiro. Obrigado!!Solução existente
A solução mais curta e provavelmente a mais rápida é:
Construindo seu próprio
Você também pode criar sua própria solução. Geralmente você tem duas abordagens. O que melhor me convém é:
(funciona também para números maiores, quando o resultado se torna
long
)A segunda maneira de conseguir o mesmo é:
fonte
fonte
factorial(999)
(e acima) irá aumentar aRuntimeError
menos que você aumentar o limite de recursão do PythonSe você estiver usando o Python2.5 ou mais antigo, tente
para Python mais recente, há fatorial no módulo de matemática, conforme indicado em outras respostas aqui
fonte
reduce
foi removida a partir do Python 3.from functools import reduce
fonte
Usando um
for
loop, contando de trás para frenten
:fonte
Por razões de desempenho, não use recursão. Seria desastroso.
Verifique os resultados em execução
O uso da pilha é conveniente (como chamada recursiva), mas tem um custo: o armazenamento de informações detalhadas pode consumir muita memória.
Se a pilha estiver alta, significa que o computador armazena muitas informações sobre chamadas de função.
O método ocupa apenas memória constante (como iteração).
Ou usando o loop for
Verifique os resultados em execução
Ou Usando a função matemática integrada
Verifique os resultados em execução
fonte
fonte
Aqui está a minha tentativa
fonte
Uma linha, números rápidos e grandes também funciona:
fonte
Eu sei que isso foi respondido, mas aqui está outro método com uma compreensão de lista de intervalo reverso, tornando o intervalo mais fácil de ler e mais compacto:
Você pode ver uma versão completa do código nesta lista: https://gist.github.com/sadmicrowave/d4fbefc124eb69027d7a3131526e8c06
fonte
[n for n in range(num, 0, -1)]
,range
já é iterável.Outra maneira de fazer isso é usar o
np.prod
mostrado abaixo:fonte
O fatorial de um número inteiro positivo n, denotado por n !, é o produto de todos os números inteiros positivos menores ou iguais a n.
Fórmula :
n! = n * (n-1) * (n-2) * (n-3) * (n-4) * ....... * 1
Existem vários métodos para encontrar o fatorial em python usando a função / biblioteca incorporada etc. Aqui, criei uma função definida pelo usuário com referência à definição básica de fatorial.
Também podemos implementar a função fatorial usando a
recursive
técnica mostrada abaixo. Mas esse método é eficiente apenas para valores inteiros pequenos. Como na recursão, a função é chamada repetidamente e requer um espaço de memória para manter a pilha, o que não é uma abordagem eficiente ou otimizada para que valores inteiros grandes encontrem o fatorial.fonte
fonte
No código abaixo, estou inserindo o número cujo fatorial eu quero calcular. Depois disso, multiplico o número -> cujo fatorial queremos calcular com números a partir de 1,2, ...., (número cujo fatorial Eu quero calcular -1)
fonte