No lo encontré todavía. ¿Me he perdido algo? Sé que un método factorial es un programa de ejemplo común para principiantes. ¿Pero no sería útil tener una implementación estándar para que esta se pueda reutilizar? Podría usar un método de este tipo con tipos estándar (por ejemplo, int, long ...) y también con BigInteger / BigDecimal.
105
Apache Commons Math tiene algunos métodos factoriales en la clase MathUtils .
fuente
Versión de Big Numbers de HoldOffHunger :
fuente
En la práctica, rara vez se necesitan factoriales desnudos. La mayoría de las veces necesitará uno de los siguientes:
1) dividir un factorial por otro, o
2) respuesta aproximada de punto flotante.
En ambos casos, estaría mejor con soluciones personalizadas simples.
En el caso (1), digamos, si x = 90! / 85 !, entonces calcularás el resultado como x = 86 * 87 * 88 * 89 * 90, ¡sin necesidad de mantener 90! en memoria :)
En el caso (2), busque en Google "aproximación de Stirling".
fuente
Use Guayaba de la
BigIntegerMath
siguiente manera:(Funcionalidad similar para
int
ylong
está disponible enIntMath
yLongMath
respectivamente).fuente
Aunque los factoriales son un buen ejercicio para el programador principiante, no son muy útiles en la mayoría de los casos y todos saben cómo escribir una función factorial, por lo que normalmente no se encuentran en la biblioteca promedio.
fuente
Creo que esta sería la forma más rápida, mediante una tabla de búsqueda:
Para el tipo nativo
long
(8 bytes), solo puede contener hasta20!
Obviamente,
21!
provocará un desbordamiento.Por lo tanto, para el tipo nativo
long
, solo20!
se permite un máximo de , significativo y correcto.fuente
Debido a que el factorial crece tan rápido, el desbordamiento de la pila no es un problema si usa la recursividad. De hecho, ¡el valor de 20! es el más grande que se puede representar en un largo de Java. Entonces, el siguiente método calculará factorial (n) o lanzará una IllegalArgumentException si n es demasiado grande.
Otra forma (más genial) de hacer lo mismo es usar la biblioteca de flujo de Java 8 de esta manera:
Leer más sobre Factorials usando los flujos de Java 8
fuente
El paquete Apache Commons Math tiene un método factorial , creo que podrías usarlo.
fuente
La respuesta corta es: usa la recursividad.
Puede crear un método y llamar a ese método dentro del mismo método de forma recursiva:
fuente
System.out.println(calc(10));
aSystem.out.println(calc(Long.MAX_VALUE));
que debería obtener una raza bastante larga :)BigInteger
. Traté de calcular el factorial del número8020
que me dio el resultado613578884952214809325384...
que tiene27831
decimales. Entonces, incluso cuando se trabaja con númerosStackoverflow
, se arrojará un enorme no . Por supuesto que tienes razón, pero dudo que haya números tan grandes con un uso práctico :-)Prueba esto
fuente
i <= value
. El bucle for podría optimizarse ligeramente para(int i = 2; i <= value; i++)
.Encontré un truco increíble para encontrar factoriales en solo la mitad de las multiplicaciones reales.
Tenga paciencia, ya que esta es una publicación un poco larga.
Para números pares: para dividir a la mitad la multiplicación con números pares, terminará con n / 2 factores. El primer factor será el número del que estás tomando el factorial, luego el siguiente será ese número más ese número menos dos. El siguiente número será el número anterior más el último número agregado menos dos. Ha terminado cuando el último número que agregó fue dos (es decir, 2) . Eso probablemente no tuvo mucho sentido, así que déjame darte un ejemplo.
Tenga en cuenta que comencé con 8, luego el primer número que agregué fue 6, luego 4, luego 2, cada número agregado es dos menos que el número agregado antes. Este método es equivalente a multiplicar los números más pequeños por los números más grandes, solo que con menos multiplicación, así:
Simple, ¿no es así?
Ahora para números impares: si el número es impar, la suma es la misma, ya que resta dos cada vez, pero se detiene en tres. Sin embargo, el número de factores cambia. Si divide el número por dos, terminará con un número que termine en .5. La razón es que si multiplicamos los extremos juntos, nos quedamos con el número del medio. Básicamente, todo esto se puede resolver resolviendo un número de factores igual al número dividido por dos, redondeado hacia arriba. Esto probablemente tampoco tenía mucho sentido para las mentes sin conocimientos matemáticos, así que permítanme hacer un ejemplo:
Nota: Si no le gusta este método, también puede tomar el factorial del número par antes del impar (ocho en este caso) y multiplicarlo por el número impar (es decir, 9! = 8! * 9).
Ahora implementémoslo en Java:
isFirst
es una variable booleana declarada como estática; se utiliza para el primer caso en el que no queremos cambiar la suma anterior.Pruebe tanto con números pares como impares.
fuente
Puede utilizar la recursividad.
y luego, después de crear el método (función) anterior:
fuente
El único uso comercial para un factorial que se me ocurre son las fórmulas Erlang B y Erlang C, y no todo el mundo trabaja en un centro de llamadas o para la compañía telefónica. La utilidad de una función para las empresas parece dictar a menudo lo que aparece en un idioma: observe todas las funciones web, XML y de manejo de datos en los principales idiomas.
Es fácil mantener un fragmento de factorial o una función de biblioteca para algo como esto.
fuente
Un método muy sencillo para calcular factoriales:
He usado double porque pueden contener números masivos, pero puedes usar cualquier otro tipo como int, long, float, etc.
PD: Puede que esta no sea la mejor solución, pero soy nuevo en la codificación y me tomó mucho tiempo encontrar un código simple que pudiera calcular factoriales, así que tuve que escribir el método yo mismo, pero lo estoy poniendo aquí para que ayude a otras personas como yo. .
fuente
También puede usar la versión recursiva.
La recursividad suele ser menos eficiente debido a tener que empujar y hacer pop recursiones, por lo que la iteración es más rápida. Por otro lado, las versiones recursivas usan menos o ninguna variable local, lo cual es una ventaja.
fuente
Factorial es una función discreta altamente creciente, así que creo que usar BigInteger es mejor que usar int. He implementado el siguiente código para el cálculo del factorial de enteros no negativos. He utilizado la recursividad en lugar de utilizar un bucle.
Aquí el rango del entero grande es
Sin embargo, el rango del método factorial dado anteriormente se puede extender hasta dos veces usando BigInteger sin firmar.
fuente
Tenemos una sola línea para calcularlo:
fuente
Un método bastante simple
fuente
fuente
fuente
Necesitamos implementar de forma iterativa. Si lo implementamos de forma recursiva, provocará StackOverflow si la entrada se vuelve muy grande (es decir, 2 mil millones). Y necesitamos usar un número de tamaño libre como BigInteger para evitar un desbordamiento aritmático cuando un número factorial se vuelve mayor que el número máximo de un tipo dado (es decir, 2 mil millones para int). Puede usar int para un máximo de 14 de factorial y long para un máximo de 20 de factorial antes del desbordamiento.
Si no puede usar BigInteger, agregue una comprobación de errores.
fuente
fuente
while loop (para números pequeños)
fuente
Conseguí esto de EDX úselo! se llama recursividad
fuente
con recursividad:
con bucle while:
fuente
USAR LA PROGRAMACIÓN DINÁMICA ES EFICIENTE
si desea usarlo para calcular una y otra vez (como el almacenamiento en caché)
Código Java:
fuente
usar la recursividad es el método más simple. si queremos encontrar el factorial de N, tenemos que considerar los dos casos donde N = 1 y N> 1 ya que en factorial seguimos multiplicando N, N-1, N-2 ,,,,, hasta 1. si vaya a N = 0 obtendremos 0 para la respuesta. Para evitar que el factorial llegue a cero, se utiliza el siguiente método recursivo. Dentro de la función factorial, mientras N> 1, el valor de retorno se multiplica por otro inicio de la función factorial. esto mantendrá el código llamando de forma recursiva al factorial () hasta que alcance N = 1 para el caso de N = 1, devuelve N (= 1) en sí mismo y todo el resultado previamente acumulado del retorno multiplicado N s se multiplica por N = 1. Así da el resultado factorial.
fuente