¿Cómo hago para calcular un factorial de un entero en Python?
135
La forma más fácil es usar math.factorial
(disponible en Python 2.6 y superior):
import math
math.factorial(1000)
Si quiere / tiene que escribirlo usted mismo, puede usar un enfoque iterativo:
def factorial(n):
fact = 1
for num in range(2, n + 1):
fact *= num
return fact
o un enfoque recursivo :
def factorial(n):
if n < 2:
return 1
else:
return n * factorial(n-1)
Tenga en cuenta que la función factorial solo se define para enteros positivos, por lo que también debe verificar eso n >= 0
y eso isinstance(n, int)
. Si no es así, elevar ValueError
ao a TypeError
respectivamente. math.factorial
se encargará de esto por ti.
factorial
dentro de lafactorial
función. ¿Cómo puede usar la misma función dentro de la función que está definiendo actualmente? Soy nuevo en Python, así que solo estoy tratando de entender.RecursionError
para cualquier número mayor que 998 (intentefactorial(999)
) a menos que aumente el límite deEn Python 2.6 y superior, intente:
fuente
float
a esta función generará aDeprecationWarning
. Si desea hacer eso, debe convertirlon
a unint
explícito:math.factorial(int(n))
que descartará cualquier cosa después del decimal, por lo que es posible que desee verificar eson.is_integer()
No es realmente necesario ya que este es un hilo tan antiguo. Pero lo que hice aquí es otra forma de calcular el factorial de un número entero usando un ciclo while.
fuente
num = num * n
posición de la línea conn = n - 1
y ejecuto estofor i in range(1, 5): print('Factorial of', i, 'is', factorial(i))
Para cada factorial, la salida es 0. Me gustaría saber la razón por la quenum = num * n
debe ser lo primero. ¡¡Gracias!!Solución existente
La solución más corta y probablemente la más rápida es:
Construyendo tu propio
También puede crear su propia solución. Generalmente tienes dos enfoques. El que más me conviene es:
(funciona también para números más grandes, cuando el resultado se convierte
long
)La segunda forma de lograr lo mismo es:
fuente
fuente
factorial(999)
(y superior) aumentará aRuntimeError
menos que aumente el límite de recurrencia de PythonSi está utilizando Python2.5 o anterior, intente
para Python más nuevo, hay factorial en el módulo matemático como se da en otras respuestas aquí
fuente
reduce
se eliminó de Python 3.from functools import reduce
fuente
Usando un
for
bucle, contando hacia atrás desden
:fuente
Por motivos de rendimiento, no utilice la recursividad. Sería desastroso.
Verificar resultados de ejecución
El uso de la pila es conveniente (como una llamada recursiva), pero tiene un costo: almacenar información detallada puede ocupar mucha memoria.
Si la pila es alta, significa que la computadora almacena mucha información sobre las llamadas a funciones.
El método solo ocupa memoria constante (como la iteración).
O usando for loop
Verificar resultados de ejecución
O usando la función matemática incorporada
Verificar resultados de ejecución
fuente
fuente
Aquí está mi intento
fuente
Una línea, números rápidos y grandes también funciona:
fuente
Sé que esto ha sido respondido, pero aquí hay otro método con una comprensión de la lista de rango inverso, lo que hace que el rango sea más fácil de leer y más compacto:
Puede ver una versión completa del código dentro de este resumen: https://gist.github.com/sadmicrowave/d4fbefc124eb69027d7a3131526e8c06
fuente
[n for n in range(num, 0, -1)]
,range
ya es iterable.Otra forma de hacerlo es usar el que se
np.prod
muestra a continuación:fuente
Factorial de un entero positivo n, denotado por n !, es el producto de todos los enteros positivos menores o iguales a n.
Fórmula :
n! = n * (n-1) * (n-2) * (n-3) * (n-4) * ....... * 1
Hay varios métodos para encontrar el factorial en python usando la función / biblioteca incorporada, etc. Aquí creé una función definida por el usuario con referencia a la definición básica de factorial.
También podemos implementar la función factorial utilizando la
recursive
técnica que se muestra a continuación. Pero este método solo es eficiente para valores enteros pequeños. Porque en la recursividad, la función se llama repetidamente y requiere un espacio de memoria para mantener la pila, que no es un enfoque eficiente u optimizado para valores enteros grandes para encontrar el factorial.fuente
fuente
En el siguiente código, estoy ingresando el número cuyo factorial quiero calcular, después de eso estoy multiplicando el -> número cuyo factorial queremos calcular con números que comienzan desde 1,2, ..., (número cuyo factorial Quiero calcular -1)
fuente