recursive factorial-Funktion
wie kann ich diese kombinieren zwei Funktionen in einer rekursiven Funktion, um zu diesem Ergebnis zu kommen:
factorial(6)
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
dies sind die codes
def factorial( n ):
if n <1: # base case
return 1
else:
return n * factorial( n - 1 ) # recursive call
def fact(n):
for i in range(1, n+1 ):
print "%2d! = %d" % ( i, factorial( i ) )
fact(6)
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
wie sehen Sie die Ausführung dieser beiden gibt eine richtige Antwort, ich will nur zu machen, um eine rekursive Funktion.
- Ich bekomme keine Grund verbindet beides in einer Funktion.
- Hmm. Ist dieses Hausaufgaben? Was haben Sie bisher ausprobiert?
- Nicht. Es sieht gut so wie es ist. Die Kombination macht die Dinge schwieriger.
- FrustratedWithFormsDesigner: letztes Jahr Prüfung ... hahah .... Ich wünschte, ich könnte nehmen Sie die Jungs mit mir zu schreiben, meine Prüfung für mich, aber es ist nicht möglich 😛
- Der Fragesteller hatte möglicherweise abgestuft, da die Frage. Jedenfalls hoffe ich, dass der Lehrer, der wollte, dass Sie zu implementieren, die die Fakultät rekursiv sagte Ihnen, dass die Effizienz der rekursiven Lösung ist so schrecklich, dass es sollte nie erlaubt sein. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
2 Zeilen code:
Test:
Ergebnis:
kurz:
versuchen Sie dies:
Eine Sache, die ich bemerkt ist, dass Sie wieder " 1 " n<1, das bedeutet, dass Ihre Funktion gibt 1 zurück, auch für negative zahlen. Möchten Sie vielleicht, um das zu beheben.
Habe ich keine Erfahrung mit Python, aber sowas?
Ist diese Hausaufgaben durch Zufall?
Geben PEP227 einen Lesen Sie für weitere details. Die Kurzfassung ist, dass Python ermöglicht die Definition von Funktionen innerhalb von Funktionen.
n
mal, factorial(2)n-1
mal, factorial(3)n-2
mal und so weiter...Einer mehr
Ich weiß wirklich nicht, die Fakultät von negativen zahlen, aber dies funktioniert mit allen n >= 0:
Können diese 4 Zeilen code...
Und für die erste Zeit berechnen der Fakultät mit rekursiven und die while-Schleife.
Obwohl die Möglichkeit, dass TrebledJ schrieb in den Kommentaren über die Verwendung
if
ist besser. Dawhile
Schleife führt mehr Operationen (SETUP_LOOP, POP_BLOCK
) alsif
. Die Funktion ist langsamer.timeit -n 10000 -r 10
while
836 µs ± 11.8 µs pro Schleifeif
787 µs ± 7.22 µs pro Schleifewhile
ist überflüssig wiereturn
wird kick in der ersten iteration (und keine weiteren Iterationen durchgeführt wird). Ändernwhile
zuif
ist viel besser.while
und denke: "Okay, es ist Fakt, indem die Schleife"; dann eine Zeile später sehen Siereturn
und merke, dass es tatsächlich die Fakultät mittels Rekursion. (In der Regel ist die Rekursion ein Ersatz for-Schleifen.) Und... ah, ich sehe, dass eine benchmark. Ein kleiner performance-Unterschied zwischen while-und if, aber der neue Inhalt scheint gut recherchiert. 🙂Gibt es immer irgendeine Art von einer Schleife, die in rekursiven Funktionen und einige stoppen-codes, die verhindern, dass die Schleife:
Wie Sie sehen können, die die Erfüllung der
if
Zustand führt zu der code, der tatsächlich endet die "loop" - und dies ist der wichtigste Teil einer rekursiven Funktion. Im Gegensatz dazu, dieelse
Teil der Bedingung führt zum Aufrufrecursivefactorial
Funktion wieder, die effektiv mit einer Art Schleife.Einer mehr =)