Eu não encontrei ainda. Perdi alguma coisa? Eu sei que um método fatorial é um programa de exemplo comum para iniciantes. Mas não seria útil ter uma implementação padrão para esta reutilizar? Eu poderia usar esse método com tipos padrão (Ex. Int, long ...) e com BigInteger / BigDecimal também.
105
O Apache Commons Math possui alguns métodos fatoriais na classe MathUtils .
fonte
Versão do Big Numbers por HoldOffHunger :
fonte
Fatoriais nus raramente são necessários na prática. Na maioria das vezes, você precisará de um dos seguintes:
1) dividir um fatorial por outro, ou
2) resposta aproximada de ponto flutuante.
Em ambos os casos, você ficaria melhor com soluções personalizadas simples.
No caso (1), diga, se x = 90! / 85 !, então você calculará o resultado da mesma maneira que x = 86 * 87 * 88 * 89 * 90, sem a necessidade de segurar 90! em memória :)
No caso (2), procure no Google por "aproximação de Stirling".
fonte
Use a goiaba da
BigIntegerMath
seguinte maneira:(Funcionalidades semelhantes para
int
elong
estão disponíveis emIntMath
eLongMath
respectivamente.)fonte
Embora os fatoriais sejam um bom exercício para o programador iniciante, eles não são muito úteis na maioria dos casos, e todos sabem como escrever uma função fatorial, portanto, normalmente não estão na biblioteca comum.
fonte
acredito que essa seria a maneira mais rápida, por meio de uma tabela de consulta:
Para o tipo nativo
long
(8 bytes), ele só pode conter até20!
Obviamente,
21!
causará estouro.Portanto, para o tipo nativo
long
, apenas um máximo de20!
é permitido, significativo e correto.fonte
Como o fatorial cresce muito rapidamente, o estouro de pilha não é um problema se você usar a recursão. Na verdade, o valor de 20! é o maior que se pode representar em um Java long. Portanto, o método a seguir calculará o fatorial (n) ou lançará uma IllegalArgumentException se n for muito grande.
Outra maneira (mais legal) de fazer as mesmas coisas é usar a biblioteca de fluxo do Java 8 assim:
Leia mais sobre fatoriais usando fluxos do Java 8
fonte
O pacote Apache Commons Math tem um método fatorial , acho que você poderia usá-lo.
fonte
A resposta curta é: use recursão.
Você pode criar um método e chamar esse método dentro do mesmo método recursivamente:
fonte
System.out.println(calc(10));
paraSystem.out.println(calc(Long.MAX_VALUE));
você deve obter stactrace bem longo :)BigInteger
. Tentei calcular o fatorial do número8020
que me deu o resultado613578884952214809325384...
que tem27831
casas decimais. Portanto, mesmo quando se trabalha com números, esse grande nãoStackoverflow
será lançado. Claro que você está certo, mas eu duvido que haja números tão grandes assim com um uso prático :-)Tente isto
fonte
i <= value
. O loop for pode ser ligeiramente otimizado para(int i = 2; i <= value; i++)
.Eu descobri um truque incrível para encontrar fatoriais em apenas metade das multiplicações reais.
Por favor, seja paciente, pois esta é uma postagem um pouco longa.
Para números pares : Para reduzir pela metade a multiplicação com números pares, você acabará com n / 2 fatores. O primeiro fator será o número do qual você está tirando o fatorial, então o próximo será aquele número mais aquele número menos dois. O próximo número será o número anterior mais o último número adicionado menos dois. Você terá terminado quando o último número adicionado for dois (ou seja, 2) . Isso provavelmente não fazia muito sentido, então deixe-me dar um exemplo.
Observe que comecei com 8, depois o primeiro número que adicionei foi 6, depois 4 e 2, cada número adicionado sendo dois a menos que o número adicionado antes dele. Este método equivale a multiplicar o menor número pelos maiores números, apenas com menos multiplicação, assim:
Simples, não é :)
Agora, para números ímpares: Se o número for ímpar, a soma é a mesma, já que você subtrai dois de cada vez, mas pára no três. O número de fatores, entretanto, muda. Se você dividir o número por dois, acabará com algum número terminando em 0,5. A razão é que, se multiplicarmos as pontas, ficamos com o número do meio. Basicamente, tudo isso pode ser resolvido resolvendo para um número de fatores igual ao número dividido por dois, arredondado para cima. Isso provavelmente não fazia muito sentido para mentes sem formação matemática, então deixe-me dar um exemplo:
Nota: Se você não gostar deste método, você também pode simplesmente pegar o fatorial do número par antes do ímpar (oito neste caso) e multiplicá-lo pelo número ímpar (ou seja, 9! = 8! * 9).
Agora vamos implementá-lo em Java:
isFirst
é uma variável booleana declarada como estática; é usado para o primeiro caso em que não queremos alterar a soma anterior.Experimente com números pares e ímpares.
fonte
Você pode usar recursão.
e depois de criar o método (função) acima:
fonte
O único uso comercial para um fatorial que consigo pensar são as fórmulas Erlang B e Erlang C, e nem todo mundo trabalha em um call center ou para a companhia telefônica. A utilidade de um recurso para negócios parece frequentemente ditar o que aparece em uma linguagem - observe todo o manuseio de dados, XML e funções da web nas principais linguagens.
É fácil manter um fragmento fatorial ou função de biblioteca para algo assim.
fonte
Um método muito simples para calcular fatoriais:
Usei double porque eles podem conter números enormes, mas você pode usar qualquer outro tipo, como int, long, float, etc.
PS Esta pode não ser a melhor solução, mas eu sou novo em programação e levei muito tempo para encontrar um código simples que pudesse calcular fatoriais, então eu tive que escrever o método sozinho, mas estou colocando isso aqui para ajudar outras pessoas como eu .
fonte
Você também pode usar a versão de recursão.
A recursão geralmente é menos eficiente devido à necessidade de enviar e fazer pop recursões, de modo que a iteração é mais rápida. Por outro lado, as versões recursivas usam menos ou nenhuma variável local, o que é uma vantagem.
fonte
Fatorial é uma função discreta altamente crescente. Portanto, acho que usar BigInteger é melhor do que usar int. Implementei o código a seguir para o cálculo do fatorial de inteiros não negativos. Usei a recursão em vez de usar um loop.
Aqui, o intervalo de inteiro grande é
No entanto, o intervalo do método fatorial fornecido acima pode ser estendido até duas vezes usando BigInteger não assinado.
fonte
Temos uma única linha para calculá-lo:
fonte
Um método bastante simples
fonte
fonte
fonte
Precisamos implementar iterativamente. Se implementarmos recursivamente, isso causará StackOverflow se a entrada se tornar muito grande (ou seja, 2 bilhões). E precisamos usar o número de tamanho não acoplado, como BigInteger para evitar um estouro aritmático quando um número fatorial se torna maior do que o número máximo de um determinado tipo (ou seja, 2 bilhões para int). Você pode usar int para no máximo 14 de fatorial e long para no máximo 20 de fatorial antes do estouro.
Se você não puder usar BigInteger, adicione uma verificação de erro.
fonte
fonte
loop while (para números pequenos)
fonte
Peguei isso do EDX use-o! é chamado de recursão
fonte
com recursão:
com loop while:
fonte
USAR A PROGRAMAÇÃO DINÂMICA É EFICIENTE
se você quiser usá-lo para calcular repetidamente (como cache)
Código Java:
fonte
usar recursão é o método mais simples. se quisermos encontrar o fatorial de N, temos que considerar os dois casos onde N = 1 e N> 1 já que no fatorial continuamos multiplicando N, N-1, N-2 ,,,,,, até 1. se nós vá para N = 0 obteremos 0 para a resposta. para impedir que o fatorial chegue a zero, é usado o seguinte método recursivo. Dentro da função fatorial, enquanto N> 1, o valor de retorno é multiplicado com outra iniciação da função fatorial. isso irá manter o código chamando recursivamente o fatorial () até atingir N = 1. para o caso N = 1, ele retorna N (= 1) e todo o resultado previamente construído do retorno multiplicado N s é multiplicado por N = 1. Assim, dá o resultado fatorial.
fonte