Ich habe es noch nicht gefunden. Habe ich etwas verpasst? Ich weiß, dass eine faktorielle Methode ein gängiges Beispielprogramm für Anfänger ist. Aber wäre es nicht sinnvoll, eine Standardimplementierung für diese wiederzuverwenden? Ich könnte eine solche Methode auch mit Standardtypen (zB int, long ...) und mit BigInteger / BigDecimal verwenden.
105
Apache Commons Math verfügt über einige faktorielle Methoden in der MathUtils- Klasse.
quelle
Big Numbers Version von HoldOffHunger :
quelle
Nackte nackte Fakultäten werden in der Praxis selten benötigt. Am häufigsten benötigen Sie eine der folgenden Möglichkeiten:
1) Teilen Sie eine Fakultät durch eine andere, oder
2) ungefähre Gleitkommaantwort.
In beiden Fällen sind einfache benutzerdefinierte Lösungen besser geeignet.
In Fall (1) sagen wir, wenn x = 90! / 85!, Dann berechnen Sie das Ergebnis genauso wie x = 86 * 87 * 88 * 89 * 90, ohne 90 halten zu müssen! in Erinnerung :)
In Fall (2) googeln Sie nach "Stirlings Annäherung".
quelle
Verwenden Sie Guaven
BigIntegerMath
wie folgt:(Ähnliche Funktionen für
int
undlong
sind inIntMath
und verfügbarLongMath
angezeigt .)quelle
Obwohl Fakultäten eine gute Übung für den Anfänger sind, sind sie in den meisten Fällen nicht sehr nützlich , und jeder weiß, wie man eine Fakultätsfunktion schreibt, sodass sie normalerweise nicht in der durchschnittlichen Bibliothek enthalten sind.
quelle
Ich glaube, dies wäre der schnellste Weg durch eine Nachschlagetabelle:
Für den nativen Typ
long
(8 Bytes) kann er nur bis halten20!
Offensichtlich
21!
wird es zu einem Überlauf kommen.Daher ist für den nativen Typ
long
nur ein Maximum von20!
zulässig, sinnvoll und korrekt.quelle
Da die Fakultät so schnell wächst, ist der Stapelüberlauf kein Problem, wenn Sie die Rekursion verwenden. In der Tat ist der Wert von 20! ist die größte, die man in einem Java Long darstellen kann. Die folgende Methode berechnet also entweder Fakultät (n) oder löst eine IllegalArgumentException aus, wenn n zu groß ist.
Eine andere (coolere) Möglichkeit, dasselbe zu tun, besteht darin, die Stream-Bibliothek von Java 8 wie folgt zu verwenden:
Lesen Sie mehr darüber Factorials mit Java 8-Streams
quelle
Das Apache Commons Math-Paket hat eine faktorielle Methode , ich denke, Sie könnten diese verwenden.
quelle
Kurze Antwort lautet: Rekursion verwenden.
Sie können eine Methode erstellen und diese Methode direkt innerhalb derselben Methode rekursiv aufrufen:
quelle
System.out.println(calc(10));
zuSystem.out.println(calc(Long.MAX_VALUE));
Sie sollten ziemlich lange Stactrace bekommen :)BigInteger
. Ich habe versucht, die Fakultät der Zahl zu berechnen, die8020
mir das Ergebnis613578884952214809325384...
mit27831
Dezimalstellen gegeben hat. Selbst wenn Sie mit Zahlen arbeiten, wird dieses riesige NeinStackoverflow
geworfen. Natürlich hast du recht, aber ich bezweifle, dass es Zahlen gibt, die bei praktischer Verwendung so groß sind :-)Versuche dies
quelle
i <= value
. Die for-Schleife könnte leicht optimiert werden(int i = 2; i <= value; i++)
.Ich habe einen erstaunlichen Trick gefunden, um Fakultäten in nur der Hälfte der tatsächlichen Multiplikationen zu finden.
Bitte haben Sie etwas Geduld, da dies ein etwas langer Beitrag ist.
Für gerade Zahlen: Um die Multiplikation mit geraden Zahlen zu halbieren, erhalten Sie n / 2 Faktoren. Der erste Faktor ist die Zahl, von der Sie die Fakultät nehmen, der nächste ist diese Zahl plus diese Zahl minus zwei. Die nächste Nummer ist die vorherige Nummer plus die zuletzt hinzugefügte Nummer minus zwei. Sie sind fertig, wenn die letzte Zahl, die Sie hinzugefügt haben, zwei war (dh 2) . Das hat wahrscheinlich nicht viel Sinn gemacht, also lassen Sie mich Ihnen ein Beispiel geben.
Beachten Sie, dass ich mit 8 angefangen habe, dann war die erste Zahl, die ich hinzugefügt habe, 6, dann 4, dann 2, wobei jede hinzugefügte Zahl zwei weniger ist als die zuvor hinzugefügte Zahl. Diese Methode entspricht dem Multiplizieren der kleinsten Zahlen mit den größten Zahlen, nur mit weniger Multiplikation, wie folgt:
Einfach ist es nicht :)
Jetzt für ungerade Zahlen: Wenn die Zahl ungerade ist, ist das Addieren dasselbe, da Sie jedes Mal zwei subtrahieren, aber bei drei aufhören. Die Anzahl der Faktoren ändert sich jedoch. Wenn Sie die Zahl durch zwei teilen, erhalten Sie eine Zahl, die auf .5 endet. Der Grund ist, dass, wenn wir die Enden miteinander multiplizieren, die mittlere Zahl übrig bleibt. Grundsätzlich kann dies alles gelöst werden, indem nach einer Anzahl von Faktoren gesucht wird, die gleich der durch zwei geteilten Zahl sind, aufgerundet. Für Köpfe ohne mathematischen Hintergrund ergab dies wahrscheinlich auch keinen Sinn. Lassen Sie mich ein Beispiel geben:
Hinweis: Wenn Ihnen diese Methode nicht gefällt, können Sie auch einfach die Fakultät der geraden Zahl vor der ungeraden Zahl (in diesem Fall acht) nehmen und mit der ungeraden Zahl multiplizieren (dh 9! = 8! * 9).
Jetzt implementieren wir es in Java:
isFirst
ist eine als statisch deklarierte boolesche Variable; Es wird für den ersten Fall verwendet, in dem wir die vorherige Summe nicht ändern möchten.Versuchen Sie es mit geraden und ungeraden Zahlen.
quelle
Sie können die Rekursion verwenden.
und dann, nachdem Sie die obige Methode (Funktion) erstellt haben:
quelle
Die einzige geschäftliche Verwendung für eine Fakultät, an die ich denken kann, sind die Erlang B- und Erlang C-Formeln, und nicht jeder arbeitet in einem Callcenter oder für die Telefongesellschaft. Die Nützlichkeit einer Funktion für Unternehmen scheint häufig zu bestimmen, was in einer Sprache angezeigt wird - sehen Sie sich alle Datenverarbeitungs-, XML- und Webfunktionen in den wichtigsten Sprachen an.
Es ist einfach, ein faktorielles Snippet oder eine Bibliotheksfunktion für so etwas beizubehalten.
quelle
Eine sehr einfache Methode zur Berechnung von Fakultäten:
Ich habe double verwendet, weil sie massive Zahlen enthalten können, aber Sie können jeden anderen Typ wie int, long, float usw. verwenden.
PS Dies ist möglicherweise nicht die beste Lösung, aber ich bin neu in der Codierung und es hat ewig gedauert, bis ich einen einfachen Code gefunden habe, der Fakultäten berechnen kann. Deshalb musste ich die Methode selbst schreiben, aber ich setze sie hier ein, damit sie anderen Leuten wie mir hilft .
quelle
Sie können auch die Rekursionsversion verwenden.
Rekursion ist normalerweise weniger effizient, da Rekursionen verschoben und verschoben werden müssen, sodass die Iteration schneller erfolgt. Andererseits verwenden rekursive Versionen weniger oder keine lokalen Variablen, was von Vorteil ist.
quelle
Factorial ist eine stark zunehmende diskrete Funktion. Ich denke also, dass die Verwendung von BigInteger besser ist als die Verwendung von int. Ich habe den folgenden Code zur Berechnung der Fakultät für nicht negative ganze Zahlen implementiert. Ich habe die Rekursion anstelle der Verwendung einer Schleife verwendet.
Hier ist der Bereich der großen ganzen Zahl
Der Bereich der oben angegebenen faktoriellen Methode kann jedoch durch Verwendung von BigInteger ohne Vorzeichen auf das Doppelte erweitert werden.
quelle
Wir haben eine einzige Zeile, um es zu berechnen:
quelle
Eine ziemlich einfache Methode
quelle
quelle
quelle
Wir müssen iterativ implementieren. Wenn wir rekursiv implementieren, wird StackOverflow verursacht, wenn die Eingabe sehr groß wird (dh 2 Milliarden). Und wir müssen eine ungebundene Größenzahl wie BigInteger verwenden, um einen arithmatischen Überlauf zu vermeiden, wenn eine Fakultätszahl größer als die maximale Anzahl eines bestimmten Typs wird (dh 2 Milliarden für int). Sie können int für maximal 14 Fakultäten und long für maximal 20 Fakultäten vor dem Überlauf verwenden.
Wenn Sie BigInteger nicht verwenden können, fügen Sie eine Fehlerprüfung hinzu.
quelle
quelle
while-Schleife (für kleine Zahlen)
quelle
Ich habe das von EDX bekommen, benutze es! Es heißt Rekursion
quelle
mit Rekursion:
mit while-Schleife:
quelle
DIE VERWENDUNG VON DYNAMISCHER PROGRAMMIERUNG IST EFFIZIENT
wenn Sie es verwenden möchten, um immer wieder zu berechnen (wie Caching)
Java-Code:
quelle
Die Verwendung der Rekursion ist die einfachste Methode. Wenn wir die Fakultät von N finden wollen, müssen wir die beiden Fälle betrachten, in denen N = 1 und N> 1 ist, da wir in der Fakultät N, N-1, N-2 ,,,,, bis 1 multiplizieren, wenn wir gehe zu N = 0, wir bekommen 0 für die Antwort. Um zu verhindern, dass die Fakultät Null erreicht, wird die folgende rekursive Methode verwendet. Innerhalb der Fakultätsfunktion wird der Rückgabewert mit einer weiteren Initiierung der Fakultätsfunktion multipliziert, während N> 1 ist. Dadurch bleibt der Code so, dass er die Fakultät () rekursiv aufruft, bis er N = 1 erreicht. Für den Fall N = 1 gibt er N (= 1) selbst zurück und alle zuvor aufgebauten Ergebnisse der multiplizierten Rückgabe N s werden mit N multipliziert = 1. Somit ergibt sich das faktorielle Ergebnis.
quelle