Seite 1 von 1

Fakultät berechnen

Verfasst: Sonntag 16. September 2012, 08:13
von kay2012
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 ?

Re: Fakultät berechnen

Verfasst: Sonntag 16. September 2012, 08:56
von /me
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.

Re: Fakultät berechnen

Verfasst: Sonntag 16. September 2012, 08:57
von 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.

Re: Fakultät berechnen

Verfasst: Sonntag 16. September 2012, 09:24
von kay2012
@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)

Re: Fakultät berechnen

Verfasst: Sonntag 16. September 2012, 11:44
von Hyperion
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.

Re: Fakultät berechnen

Verfasst: Sonntag 16. September 2012, 12:25
von kay2012
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 !

Re: Fakultät berechnen

Verfasst: Sonntag 16. September 2012, 12:28
von Hyperion
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...

Re: Fakultät berechnen

Verfasst: Sonntag 16. September 2012, 12:44
von DasIch
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.

Re: Fakultät berechnen

Verfasst: Sonntag 16. September 2012, 12:49
von kay2012
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^^

Re: Fakultät berechnen

Verfasst: Sonntag 16. September 2012, 13:00
von EyDu
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.

Re: Fakultät berechnen

Verfasst: Sonntag 16. September 2012, 13:40
von Hyperion
@DasIch: Genau an das gleiche dachte ich auch... :-)

Re: Fakultät berechnen

Verfasst: Sonntag 16. September 2012, 13:50
von kay2012
@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.