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.
Antworten
kay2012
User
Beiträge: 14
Registriert: Montag 10. September 2012, 17:05

Hallo liebe Leute,

ich hab mit folgenden Code ein Verständnisproblem (gibt es das Wort überhaupt?):

Code: Alles auswählen

while True:
    zahl = int(input("Geben Sie eine Zahl ein: "))
    if zahl < 0:
        print("Negative Zahlen sind nicht erlaubt")
        continue
    ergebnis = 1
    for i in range(1, zahl+1):
        ergebnis = ergebnis * i
    print("Ergebnis: ", ergebnis)
Wenn ich dies in IDLE ausführe, und zuerst die zahl 2 eintippe , erhalte ich eine 2 zurück.
Gebe ich danach eine 3 ein, erhalte ich (so soll es sein) eine 6 zurück: 2 * 3 = 6
Wenn ich jedoch 2 mal nacheinander die 2 eintippe, erhalte ich jedoch eine 2.
Erwarten würde ich eine 4, weil 2 * 2 = 4 sind.
Gebe ich bei range(0, zahl+1): ein, erhalte ich immer eine 0, trage ich range(2, zahl+1) ein, erhalte ich
WENN ich immer eine 2 eintippe auch immer eine 2.

Woran liegt das ?
Programmieranfänger

Bücher:
Python 3 - Das umfassende Handbuch (J.Ernesti, P. Kaiser - 3. akt. und erw. Auflage 2012) = ABSOLUTER MÜLL !!
wxpython in action (englisch)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

kay2012 hat geschrieben:Wenn ich jedoch 2 mal nacheinander die 2 eintippe, erhalte ich jedoch eine 2.
Erwarten würde ich eine 4, weil 2 * 2 = 4 sind.
Gebe ich bei range(0, zahl+1): ein, erhalte ich immer eine 0, trage ich range(2, zahl+1) ein, erhalte ich
WENN ich immer eine 2 eintippe auch immer eine 2.
Ich kann dein gedankliches Problem nicht nachvollziehen. Natürlich bekommst du jedes Mal eine 2 zurück wenn du eine 2 als Eingabewert nimmst. Von diesem Algorithmus wird erwartet, dass er bei gleicher Eingabe das gleiche Ergebnis liefert. Gibt es irgendeinen Grund, warum du davon ausgehst, dass die Ergebnisse aufsummiert werden sollten?

Wenn du range(0, zahl + 1) verwendest muss zwangsläufig bei jeder Eingabe 0 herauskommen, da du das Ergebnis mit 0 multiplizierst. range(1, zahl + 1) und range(2, zahl + 1) machen bei diesem Algorithmus keinen Unterschied, da du im ersten Fall das Ergebnis einfach zusätzlich noch mit 1 multiplizierst und dass sich das nicht auf das Ergebnis auswirkt ist offensichtlich.

Deine Frage wirkt irgendwie, als hättest du den Code irgendwo gefunden und eingegeben, dir aber nie wirklich Gedanken dazu gemacht wie der Algorithmus eigentlich funktioniert. Versuch mal den Code von Hand durchzugehen und notiere dir auf einem Blatt bei jedem einzelnen Schritt die (geänderten) Werte.
BlackJack

@kay2012: Natürlich bekommst Du bei 2 immer eine 2 weil das nun mal die Fakultät von 2 ist: 1 * 2 = 2. Genau so wirst Du bei 3 immer eine 6 bekommen (1 * 2 * 3 = 6) und bei 4 immer eine 24 (= 1 * 2 * 3 * 4).

Wie kommst Du auf die Idee das eine eingegebene Zahl in einem Durchlauf der ``while``-Schleife einen Einfluss auf den nächsten Durchlauf haben sollte? Welcher Name wäre denn Deiner Meinung nach an einen Wert gebunden der das bewirkt?

Vollziehe den Algorithmus doch mal selbst Schritt für Schritt nach.
kay2012
User
Beiträge: 14
Registriert: Montag 10. September 2012, 17:05

@BlackJack: Danke !

Ich habe den Code nicht irgendwo her, sonder aus dem Buch Python 3 (siehe Signatur, ok es ist von galileo aber das Problem lag hier wohl auf meiner Seite).

Scheinbar hatte ich schlichtweg ein Problem mit dem Thema Fakultät, sprich 1*2 = 2 und bei 3 = 1*2*3 = 6
Ich habe es mit normale Multiplikation verwechselt und kam durcheinander.

Das mit der Whileschleife 8also meine Vermutung oben) war natürlich im Nachhinein betrachtet völliger Mumpitz.
Nun ist alles wieder gut.

Vielen Dank.

Nachtrag: als beweis, dass ich das verstanden habe hier 3 Beispiele (kann ja sein, dass es ein anderer auch nicht versteht):

Beispiel 1 ( quasi die Erklärung ):

Code: Alles auswählen

while True:
    zahl = int(input("Geben Sie eine Zahl ein: "))
    if zahl < 0:
        print("Negative Zahlen sind nicht erlaubt")
        continue
    ergebnis = 1
    for i in range(2, zahl+1):      # ergibt 2 bei eingabe einer 2 , ergebnis (1) = ergebnis (1) * i (2)   , also 1 * 2 = 2
        ergebnis = ergebnis * i    
    print("Ergebnis: ", ergebnis)
Beispiel 2:

Code: Alles auswählen

while True:
    zahl = int(input("Geben Sie eine Zahl ein: "))
    if zahl < 0:
        print("Negative Zahlen sind nicht erlaubt")
        continue
    ergebnis = 1
    for i in range(3, zahl+1):      # ergibt bei eingabe einer 4 eine 12 denn ergebnis ist zahl+1 , also 3 * 4 = 12
        ergebnis = ergebnis * i
    print("Ergebnis: ", ergebnis)
Beispiel 3:

Code: Alles auswählen

while True:
    zahl = int(input("Geben Sie eine Zahl ein: "))
    if zahl < 0:
        print("Negative Zahlen sind nicht erlaubt")
        continue
    ergebnis = 1
    for i in range(6, zahl+1):     # ergibt 336 bei eingabe einer 8  /// 6 + 1 = 7 , also 6 * 7 * 8 = 336
        ergebnis = ergebnis * i
    print("Ergebnis: ", ergebnis)
Programmieranfänger

Bücher:
Python 3 - Das umfassende Handbuch (J.Ernesti, P. Kaiser - 3. akt. und erw. Auflage 2012) = ABSOLUTER MÜLL !!
wxpython in action (englisch)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

kay2012 hat geschrieben: Ich habe den Code nicht irgendwo her, sonder aus dem Buch Python 3 (siehe Signatur, ok es ist von galileo aber das Problem lag hier wohl auf meiner Seite).
*Schauder* Von Büchern im Python-Umfeld, auf denen "Ernesti und Kaiser" drauf steht, solltest Du die Finger lassen! Gründe dafür findest Du hier schön zusammengefasst.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
kay2012
User
Beiträge: 14
Registriert: Montag 10. September 2012, 17:05

3. akt. und erw. Auflage 2012
Also noch wurde mir nicht schlecht^^
Falls da aber noch was kommen sollte, können wir das ja gern aufbröseln ! :lol:

Schönen Tag wünsch ich Euch !
Programmieranfänger

Bücher:
Python 3 - Das umfassende Handbuch (J.Ernesti, P. Kaiser - 3. akt. und erw. Auflage 2012) = ABSOLUTER MÜLL !!
wxpython in action (englisch)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hm... es mag sein, dass sich da etwas getan hat. Ein Buch mit solchen gravierenden Fehlern zeugt aber nicht gerade von der Kompetenz der Autoren - ob die diese Schwächen tatsächlich ausgebügelt haben? Naja, musst Du ja wissen, ob Du denen weiter hin vertraust...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

kay2012 hat geschrieben:
3. akt. und erw. Auflage 2012
Also noch wurde mir nicht schlecht^^
Falls da aber noch was kommen sollte, können wir das ja gern aufbröseln ! :lol:
Das Problem ist ja dass man als lernender oft gar nicht merkt dass man falsches, schlechtes oder zumindest nicht ganz optimales lernt. Der Code den du gezeigt hast funktioniert zwar ist aber doch eher unschön. Mag jetzt natürlich auch daran liegen dass Funktionen noch nicht eingeführt wurden und es eine bewusste Entscheidung des Autors war, wurden sie dass allerdings schon, würde ich mir ein anderes Tutorial suchen.
kay2012
User
Beiträge: 14
Registriert: Montag 10. September 2012, 17:05

Bei der Übung ging es um das "for" in Zusammenhang mit einer while Schleife in dem if.

Weiß ja nicht, ob es das besser macht.
Selbst wenn das Buch Fehler enthalten sollte, können diese ja meine Frustrationstoleranz gerne steigern^^
Programmieranfänger

Bücher:
Python 3 - Das umfassende Handbuch (J.Ernesti, P. Kaiser - 3. akt. und erw. Auflage 2012) = ABSOLUTER MÜLL !!
wxpython in action (englisch)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

kay2012 hat geschrieben:Selbst wenn das Buch Fehler enthalten sollte, können diese ja meine Frustrationstoleranz gerne steigern^^
Du verstehst den Begriff "Fehler" in diesem Kontext falsch. Gemeint sind keine Fehler im Programm, so dass diese nicht funktionieren würden oder nicht starten, sondern Fehler im Umgang mit der Sprache. Das heißt, es werden Dinge anders gemacht, als eine erfahrene Person es machen würde. Es wird gegen die Sprache programmiert, einige Dinge sind unnötig kompliziert und auch falsche Aussagen sind darunter (zum Beispie, dass doppelte führende Unterstriche angeblich eine Markierung für private Attribute seien). Als Anfänger hast du gar keine Chance solche Fehler zu erkennen, da dir einfach das Hintergrundwissen fehlt.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@DasIch: Genau an das gleiche dachte ich auch... :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
kay2012
User
Beiträge: 14
Registriert: Montag 10. September 2012, 17:05

@EyDu: DOCH, in genau solch einem Kontext habe ich es verstanden.

Ich habe mir den oben verlinkten Beitrag angesehen, hoffe aber mit nächsten Problemen nicht auf eben solche
Fehler zu stoßen.
Naja, wir werden sehen.
Programmieranfänger

Bücher:
Python 3 - Das umfassende Handbuch (J.Ernesti, P. Kaiser - 3. akt. und erw. Auflage 2012) = ABSOLUTER MÜLL !!
wxpython in action (englisch)
Antworten