Python/ Übungen/ Collatz/ Lösung

Eine mögliche Lösung zur Collatz-Übung

"""Das Collatz-Problem"""
print("Das Collatz-Problem...")

zahl = 0
while zahl <= 0:
    eingabe = input("Bitte geben Sie eine positive Ganzzahl ein: ")
    try:
        zahl = int(eingabe)
    except ValueError:
        print("Das sieht nicht wie eine positive Ganzzahl aus!")

collatz = []
while True:
    collatz.append(zahl)
    # nur abbrechen, falls der Nutzer nicht 1 eingegeben hat
    if zahl == 1 and len(collatz) > 1:
        break
    if zahl % 2 == 0:  # ist die Nummer gerade?
        zahl = zahl // 2
    else:
        zahl = 3 * zahl + 1

print(f"Ihre Collatz-Folge: {collatz}")

Anmerkungen Bearbeiten

Zeile 4-10: Die Eingabevalidierung ist schnell erklärt: wir akzeptieren nur positive Ganzzahlen. Alles, was nicht in eine Integerzahl konvertiert werden kann, wird einfach abgewiesen. Da die Anforderung an den Nutzer trivial ist, geben wir auch keine Hilfestellung sondern nur eine allgemeine Fehlermeldung.

Zeile 18-21: die Collatzfolge lässt sich auch in einer Zeile zusammenfassen: zahl = (zahl // 2, 3 * zahl + 1)[zahl % 2].

Zeile 20: Ein häufiger Fehler von Anfängern ist es, elif zahl % 2==1: anstelle des else zu nutzen (oder sogar ein zweites "if"). Wir haben es hier aber mit einer dualen Bedingung zu tun: zahl ist entweder gerade oder ungerade. Ist die Prüfung auf gerade nicht erfolgreich, muss zahl logischerweise ungerade sein, da braucht es keine weitere Prüfung.

Zeile 13-21: Im Netz finden sich Lösungen mit while zahl > 1 und die aktuelle Zahl wird in der Schleife mittels print ausgegeben. Gibt der Nutzer allerdings "1" als Zahl ein, wird die Collatzfolge "1" ausgegeben, anstelle der richtigen Lösung "1, 4, 2, 1" (weil die Schleife schon nach dem ersten Durchgang abbricht).