python fakultät programmieren?
für die fakultät einer zahl N. also N! quasi. wie würde das gehen? mein ansatz:
def funktion(N):
x = 1
for n in range(1,N)
x*=n
return x
5 Antworten
![](https://images.gutefrage.net/media/default/user/9_nmmslarge.png?v=1551279448000)
Der Ansatz ist nicht schlecht.
Kleiner Tipp:
Du kannst den vorherigen Wert in einer zweiten Variable speichern, mit dem aktuellen Wert der Laufvariable multiplizieren und dann die zweite Variable durch den nächsthöheren Wert ersetzen.
![](https://images.gutefrage.net/media/default/user/9_nmmslarge.png?v=1551279448000)
![](https://images.gutefrage.net/media/user/Isendrak/1555747535308_nmmslarge__0_0_160_160_7f828fad18ee7edb96b8daceedaeeadb.png?v=1555747535000)
Das würde es für jede beliebige Zahl 1 zurückgeben.
So sollte das laufen:
def faculty(n):
if n < 0: raise ValueError("n must be >= 0")
result = 1
for x in range(2, n + 1):
result *= x
return result
![](https://images.gutefrage.net/media/default/user/12_nmmslarge.png?v=1551279448000)
den teil if n < 0: raise ValueError("n must be >= 0") versteh ich nicht. ist das überhaupt nötig und was macht das?
![](https://images.gutefrage.net/media/user/markb1980/1681139302408_nmmslarge__48_125_295_295_4c6a09f2bf04e2cbd5d90baed9bca973.jpg?v=1681139302000)
Der Teil gibt einen Fehler aus wenn du faculty(0) oder faculty(-20) aufrufst...
![](https://images.gutefrage.net/media/user/Isendrak/1555747535308_nmmslarge__0_0_160_160_7f828fad18ee7edb96b8daceedaeeadb.png?v=1555747535000)
Nicht ganz. faculty(0) gibt ordnungsgemäß den Wert 1 zurück. Nur für n<0 ist die Fakultät nicht definiert.
![](https://images.gutefrage.net/media/default/user/12_nmmslarge.png?v=1551279448000)
und warum muss ich 2 und n + 1 wählen? bei listen hab ich gemerkt, dass er die letzte zahl nie annimmt, also quasi wie ein offenes intervall...
ist das bei der anfangszahl auch so?
![](https://images.gutefrage.net/media/user/Isendrak/1555747535308_nmmslarge__0_0_160_160_7f828fad18ee7edb96b8daceedaeeadb.png?v=1555747535000)
2 als Startwert, da 1*1 redundant wäre.
n+1 als "Endwert", da list(range(2,5)) = [2,3,4], wobei [2,3,4,5] für n=5 benötigt wird.
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
Wenn es eien Fingerübung ist:
import math
math.factorial(n)
Wenn die Implementierung selbst gemacht werden soll, dann gibt es einen ganzen Strauß an Ansätzen, Isendrak hat Dir bereits den iterativ imperativen Ansatz gezeigt.
![](https://images.gutefrage.net/media/user/PhotonX/1444747801_nmmslarge.jpg?v=1444747801000)
Oder auch rekursiv:
function factorial(n) {
if (n>1) {
return n*factorial(n-1);
} else if {
return 1;
}
}
![](https://images.gutefrage.net/media/default/user/11_nmmslarge.png?v=1551279448000)
Hier findest du ein iteratives und ein rekursives Beispiel in Java und Python: https://de.wikipedia.org/wiki/Fakult%C3%A4t_%28Mathematik%29#Numerische_Berechnung_und_N%C3%A4herung
edit: da sollte eigentlich x *= n stehen