Fakultät berechnen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
breathe_easy
User
Beiträge: 58
Registriert: Sonntag 29. Juli 2007, 18:34

Ja ich weiß keine Informatikfragen! Aber!! Mir geht es darum in Python (das ist kein Studiumsinhalt!!) die Fakultät einer eingegebenen Zahl zu berechnen und ich habe keine Ahnung wie ich die jeweiligen Zwischenergebnisse abspeichern soll.

x = input Zahl
for schleife in range (1 bis x)
x = x-1

aber wie schaffe ich es, dass die verschiedenen Werte, die x annimmt nicht verloren gehen. Welche Mittel stellt mir Python zur Verfügung. ein stack o.ä.?
Den Rest bekomme ich dann schon hin.
tux21b
User
Beiträge: 18
Registriert: Mittwoch 15. Februar 2006, 23:20
Wohnort: Linz.at
Kontaktdaten:

Du kannst eine Liste verwenden. In Python können Listen fast alles, sie haben sogar die Stack Funktionen implementiert.

Code: Alles auswählen

liste = [] # leere Liste anlegen
liste.append(1) # Elemente hinzufügen
liste.append(3)
print liste.pop() # und wieder lesen -> 3, 1
print liste.pop()
So, damit bekommst du es jetzt sicher auch alleine hin. Viel Spaß :D

Gruß
Christoph

PS: warum multiplizierst du das Ergebnis eigentlich nicht gleich aus, dann musst du nicht 2mal iterieren...
[url]http://www.ubuntuusers.de[/url]
Frank aka Ch3ck3r
User
Beiträge: 49
Registriert: Dienstag 13. November 2007, 21:56
Wohnort: Berlin
Kontaktdaten:

also ich würde es so lösen xD

Code: Alles auswählen

def fakult(n):
    #Für Re- hat die Fakultät keine Wertemenge
    if n < 0:
        raise ValueError
    #Nach Definition ist 0! = 1
    if n == 0:
        return 1
    #Ansonten wird hier die Fakultät ausgerechnet
    else:
        save = 1
        for i in range(2,n+1):
            save *= i
        return save
Zuletzt geändert von Frank aka Ch3ck3r am Samstag 17. November 2007, 00:06, insgesamt 3-mal geändert.
kostenlose TS2-Server für jeweils 31 Tage:
http://www.ts-onlyfree.de
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

übrigens: Es ist nicht schlimm "Informatiker-Fragen" zu stellen... nur wenn jemand versucht hier die fertige Loesung fuer seine Hausaufgaben zu bekommen... dann wird er nicht so viel Glueck haben...
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Code: Alles auswählen

lfac = lambda n: n-1 + abs(n-1) and lfac(n-1)*long(n) or 1
g = (lfac(x) for x in xrange(1, 5))
for x in g: print x
BlackJack

Hm, ich hätte auf `reduce()` zurückgegriffen. :-)

Code: Alles auswählen

from operator import mul


def fak(n):
    if n < 0:
        raise ValueError
    return reduce(mul, xrange(2, n + 1), 1)


def main():
    for i in xrange(20):
        print i, fak(i)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

BlackJack hat geschrieben:Hm, ich hätte auf `reduce()` zurückgegriffen. :-)
Ich weiß ;-)

NB: Bei mir gibt es keine Fehlermeldung bei Werten < 0. Das kann gewünscht sein oder auch nicht. Hängt von der Fragestellung ab.

Gruß,
Christian
breathe_easy
User
Beiträge: 58
Registriert: Sonntag 29. Juli 2007, 18:34

wow wow wow, das ist eine ganze Menge Stoff den sich ein Beginner wie ich da reinziehen muss!, aber vielen Dank für die schnellen und hoffentlich auch nütlzichen Antworten. Bleibt noch die Frage wie und vor allem wo bekomme ich einen Inhalt zu all diesen neuen Begriffen bzw. Funktionen im Moment lese ich nur How to think like a computerscientist.

Greez Michael
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

breathe_easy hat geschrieben:Bleibt noch die Frage wie und vor allem wo bekomme ich einen Inhalt zu all diesen neuen Begriffen bzw. Funktionen.
http://docs.python.org/dev/index.html
graceflotte
User
Beiträge: 25
Registriert: Samstag 8. März 2014, 12:17

nkoehring hat geschrieben:übrigens: Es ist nicht schlimm "Informatiker-Fragen" zu stellen... nur wenn jemand versucht hier die fertige Loesung fuer seine Hausaufgaben zu bekommen... dann wird er nicht so viel Glueck haben...
Nach 8 Jahren des denkens, hier die (soweit ich weiß) kürzeste Lösung:

Code: Alles auswählen

zahl = 6 #Zahl, aus der die Fakultät berechnet werden soll.
print reduce(lambda x,y: x*y, xrange(1,1+zahl))
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

graceflotte hat geschrieben:Nach 8 Jahren des denkens, hier die (soweit ich weiß) kürzeste Lösung:
Naja:

Code: Alles auswählen

import math
math.factorial(6)
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@EyDu, graceflotte: es geht also um Bytes.
48 Bytes:

Code: Alles auswählen

print reduce(lambda x,y: x*y, xrange(1,zahl+1))
39 Bytes:

Code: Alles auswählen

import math
print math.factorial(zahl)
und die kürzeste Lösung, 37 Bytes:

Code: Alles auswählen

y=x=zahl
while y>2:y-=1;x*=y
print x
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Oder wenn schon zu Fuß dann in hübsch:

Code: Alles auswählen

 reduce(mul, range(1, zahl))
Ach nee... Mist:

Code: Alles auswählen

In [35]: zahl = 1

In [36]: reduce(mul, range(1, zahl))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-36-7c3b8deb12f3> in <module>()
----> 1 reduce(mul, range(1, zahl))

TypeError: reduce() of empty sequence with no initial value
Zuletzt geändert von Hyperion am Mittwoch 7. Januar 2015, 17:02, insgesamt 1-mal geändert.
Grund: Hab mich geirrt... :-(
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ach so, es geht um Bytes :mrgreen:
34 Bytes:

Code: Alles auswählen

__import__("math").factorial(zahl)
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@EyDu: Fair bleiben, mit print sind's 41.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und wenn 's spezieller sein darf, geht es auch noch kürzer:

Code: Alles auswählen

print "720"
:twisted:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Das Leerzeichen zwischen ``print`` und der Zeichenkette könnte man noch einsparen. :-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:@Hyperion: Das Leerzeichen zwischen ``print`` und der Zeichenkette könnte man noch einsparen. :-)
Hatte kein Python 2 da, um das zu testen ;-) Aber danke für den Hinweis! :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

@Hyperion: afaik kann man bei deinem spezialfall auch die anführungszeichen weglassen :mrgreen:
PS: Die angebotene Summe ist beachtlich.
hwm
User
Beiträge: 39
Registriert: Mittwoch 20. April 2005, 23:33

Man könnte statt der beiden Gänsefüßchen auch das einfache Hochkomma nehmen, das würde noch mal jeweils 1/2 Zeichen einsparen :D
Antworten