Wie berechne ich eine Fakultät einer Ganzzahl in Python?
135
Am einfachsten ist die Verwendung math.factorial
(verfügbar in Python 2.6 und höher):
import math
math.factorial(1000)
Wenn Sie es selbst schreiben möchten / müssen, können Sie einen iterativen Ansatz verwenden:
def factorial(n):
fact = 1
for num in range(2, n + 1):
fact *= num
return fact
oder ein rekursiver Ansatz:
def factorial(n):
if n < 2:
return 1
else:
return n * factorial(n-1)
Beachten Sie, dass die Fakultätsfunktion nur für positive Ganzzahlen definiert ist. Überprüfen Sie daher auch dies n >= 0
und das isinstance(n, int)
. Wenn nicht, erhöhen Sie ein ValueError
oder ein TypeError
. math.factorial
wird sich für Sie darum kümmern.
factorial
innerhalb derfactorial
Funktion verwenden können. Wie können Sie dieselbe Funktion in der Funktion verwenden, die Sie gerade definieren? Ich bin neu in Python, also versuche ich nur zu verstehen.RecursionError
für eine beliebige Zahl größer als 998 (Versuchfactorial(999)
), es sei denn, Sie erhöhen Pythons RekursionslimitVersuchen Sie unter Python 2.6 und höher:
quelle
float
an diese Funktion übergeben, wird a ausgelöstDeprecationWarning
. Wenn Sie das tun möchten, müssen Sien
in einint
explizites konvertieren :math.factorial(int(n))
, das alles nach der Dezimalstelle verwirft, also möchten Sie das vielleicht überprüfenn.is_integer()
Nicht wirklich notwendig, da dies ein so alter Thread ist. Aber ich habe hier eine andere Möglichkeit, die Fakultät einer ganzen Zahl mit einer while-Schleife zu berechnen.
quelle
num = num * n
mit tauschen = n - 1
und diesfor i in range(1, 5): print('Factorial of', i, 'is', factorial(i))
für jedes Faktor ausführe , ist die Ausgabe 0. Ich möchte wissen, warum diesnum = num * n
zuerst geschehen muss. Vielen Dank!!Bestehende Lösung
Die kürzeste und wahrscheinlich schnellste Lösung ist:
Bauen Sie Ihre eigenen
Sie können auch Ihre eigene Lösung erstellen. Im Allgemeinen haben Sie zwei Ansätze. Das, was mir am besten passt, ist:
(Es funktioniert auch für größere Zahlen, wenn das Ergebnis wird
long
)Der zweite Weg, dies zu erreichen, ist:
quelle
quelle
factorial(999)
(und höher) wird ein erhöhen, esRuntimeError
sei denn, Sie erhöhen Pythons RekursionslimitWenn Sie Python2.5 oder älter verwenden, versuchen Sie es
Für neueres Python gibt es eine Fakultät im Mathematikmodul, wie in anderen Antworten hier angegeben
quelle
reduce
die aus Python 3 entfernt wurde.from functools import reduce
quelle
Mit einer
for
Schleife rückwärts zählen vonn
:quelle
Verwenden Sie aus Leistungsgründen keine Rekursion. Es wäre katastrophal.
Überprüfen Sie die Laufergebnisse
Die Verwendung des Stapels ist praktisch (wie ein rekursiver Aufruf), hat jedoch Kosten: Das Speichern detaillierter Informationen kann viel Speicherplatz beanspruchen.
Wenn der Stapel hoch ist, bedeutet dies, dass der Computer viele Informationen über Funktionsaufrufe speichert.
Die Methode belegt nur konstanten Speicher (wie Iteration).
Oder Verwenden der for-Schleife
Überprüfen Sie die Laufergebnisse
Oder Verwenden der integrierten Funktionsmathematik
Überprüfen Sie die Laufergebnisse
quelle
quelle
Hier ist mein Versuch
quelle
Eine Zeile, schnelle und große Zahlen funktionieren auch:
quelle
Ich weiß, dass dies beantwortet wurde, aber hier ist eine andere Methode mit einem Verständnis der umgekehrten Bereichsliste, die den Bereich leichter lesbar und kompakter macht:
Sie können eine Vollversion des Codes in dieser Übersicht sehen: https://gist.github.com/sadmicrowave/d4fbefc124eb69027d7a3131526e8c06
quelle
[n for n in range(num, 0, -1)]
,range
ist bereits iterierbar.Eine andere Möglichkeit ist
np.prod
die unten gezeigte:quelle
Fakultät einer positiven ganzen Zahl n, bezeichnet mit n!, Ist das Produkt aller positiven ganzen Zahlen kleiner oder gleich n.
Formel :
n! = n * (n-1) * (n-2) * (n-3) * (n-4) * ....... * 1
Es gibt verschiedene Methoden, um die Fakultät in Python mithilfe der eingebauten Funktion / Bibliothek usw. zu finden. Hier habe ich eine benutzerdefinierte Funktion unter Bezugnahme auf die grundlegende Definition der Fakultät erstellt.
Wir können die Fakultätsfunktion auch mithilfe der
recursive
unten gezeigten Technik implementieren . Diese Methode ist jedoch nur für kleine ganzzahlige Werte effizient. Da bei der Rekursion die Funktion wiederholt aufgerufen wird und einen Speicherplatz benötigt, um den Stapel zu verwalten, ist dies kein effizienter oder optimierter Ansatz für große ganzzahlige Werte, um die Fakultät zu finden.quelle
quelle
Im folgenden Code gebe ich die Zahl ein, deren Fakultät ich berechnen möchte. Danach multipliziere ich die -> Zahl, deren Fakultät wir berechnen möchten, mit Zahlen ab 1,2, ...., (Zahl, deren Fakultät Ich möchte -1) berechnen
quelle