audax hat geschrieben:
Code: Alles auswählen
>>> from operator import mul
>>> fak = lambda n: reduce(mul, xrange(1, n+1))
>>> fak(6)
720
Iterativ
Ach ja, gut ... Stimmt
Aber wenn man die Rekursion etwas optimiert (keine Ahnung, ob es dieses Tail Call Optimierungs-Teil von Leonidas ist), kommt's ja im Prinzip auf das Selbe hinaus. Aber okay, diese 2 Zeilen sind wohl deutlich knapper :p
BlackJack hat geschrieben:
@Karl: Dein Quelltext funktioniert nicht, weil `self` ein ganz normaler lokaler Name ist, der beim Aufruf an ein Exemplar der Klasse gebunden ist. Das heisst wenn Du `self` in einer Methode an ein anderes Objekt bindest, hat das, wie überall in Python, keinen Einfluss auf das Objekt, welches vorher an diesen Namen gebunden war.
Und bei `int` kommt noch zusätzlich hinzu, dass es sich um einen Typ handelt, der nicht verändert werden kann. Wenn `__init__()` aufgerufen wird, dann existiert das Exemplar bereits, es wird ja als erstes Argument an die Methode übergeben, und man kann den Wert nicht mehr verändern. In solchen Fällen muss man `__new__()` implementieren.
Aber letztendlich ist eine Prüfung des Arguments in der Fakultäts-Funktion und auslösen eines `ValueError` falls sie <0 ist, die einfachere Lösung.
Dass die Prüfung von <0 einfacher ist, war mir schon klar.
Hm ich dachte das mit dem `self` funktioniert vielleicht, weil es ja bei `list` auch so geht ;p
Aber warum sind eigentlich immer alle so OffTopic?
Es ging ja nicht um die Rekursion, ich hab einfach nur das Wikipedia-Beispiel gepostet. Mir ging's wie schonmal erwähnt nur um die Klasse.
Ich wollte einfach nur mal wissen, wie man in Python denn einen Datentyp für Natürliche Zahlen implementieren würde (ob's jemals gebraucht wird, ka).
`int` ist ja praktisch schon Z, man muss das ja eigentlich nur auf >=0 beschränken?
Aber so ganz haut das mit dem Erben von `int` auch nicht hin, oder? Weil man dann ja die ganzen Methoden wie __add__() usw alle noch auf >= 0 im Ergebnis beschränken müsste oO Jedenfalls wenn der Rückgabewert auch eine Natürliche Zahl werden soll