Seite 1 von 2

Fakultät berechnen

Verfasst: Mittwoch 14. November 2007, 18:53
von breathe_easy
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.

Verfasst: Mittwoch 14. November 2007, 18:59
von tux21b
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...

Verfasst: Mittwoch 14. November 2007, 19:19
von Frank aka Ch3ck3r
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

Verfasst: Mittwoch 14. November 2007, 19:19
von nkoehring
ü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...

Verfasst: Mittwoch 14. November 2007, 19:49
von CM

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

Verfasst: Mittwoch 14. November 2007, 19:55
von 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)

Verfasst: Mittwoch 14. November 2007, 20:02
von CM
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

viel neues

Verfasst: Freitag 16. November 2007, 17:15
von breathe_easy
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

Re: viel neues

Verfasst: Freitag 16. November 2007, 17:32
von EyDu
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

Re: Fakultät berechnen

Verfasst: Mittwoch 7. Januar 2015, 16:09
von graceflotte
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))

Re: Fakultät berechnen

Verfasst: Mittwoch 7. Januar 2015, 16:18
von EyDu
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)

Re: Fakultät berechnen

Verfasst: Mittwoch 7. Januar 2015, 16:51
von Sirius3
@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

Re: Fakultät berechnen

Verfasst: Mittwoch 7. Januar 2015, 16:55
von Hyperion
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

Re: Fakultät berechnen

Verfasst: Mittwoch 7. Januar 2015, 16:57
von EyDu
Ach so, es geht um Bytes :mrgreen:
34 Bytes:

Code: Alles auswählen

__import__("math").factorial(zahl)

Re: Fakultät berechnen

Verfasst: Mittwoch 7. Januar 2015, 17:29
von Sirius3
@EyDu: Fair bleiben, mit print sind's 41.

Re: Fakultät berechnen

Verfasst: Mittwoch 7. Januar 2015, 17:33
von Hyperion
Und wenn 's spezieller sein darf, geht es auch noch kürzer:

Code: Alles auswählen

print "720"
:twisted:

Re: Fakultät berechnen

Verfasst: Mittwoch 7. Januar 2015, 17:41
von BlackJack
@Hyperion: Das Leerzeichen zwischen ``print`` und der Zeichenkette könnte man noch einsparen. :-)

Re: Fakultät berechnen

Verfasst: Mittwoch 7. Januar 2015, 19:12
von Hyperion
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:

Re: Fakultät berechnen

Verfasst: Mittwoch 7. Januar 2015, 20:36
von Üpsilon
@Hyperion: afaik kann man bei deinem spezialfall auch die anführungszeichen weglassen :mrgreen:

Re: Fakultät berechnen

Verfasst: Mittwoch 7. Januar 2015, 20:38
von hwm
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