Eines Abends stießt du auf ein altes Notizbuch voller kryptischer Kritzeleien, als hätte jemand besessen einer Idee nachgejagt. Auf einer Seite stach eine einzige Frage hervor: Findet jede Zahl ihren Weg zur 1? Sie war mit etwas verbunden, das Collatz-Vermutung genannt wird: ein Rätsel, das Denkern seit Jahrzehnten Kopfzerbrechen bereitet.
Die Regeln waren trügerisch einfach. Wähle eine beliebige positive Ganzzahl.
Dann wiederholst du diese Schritte mit dem Ergebnis, und das immer weiter.
Aus Neugier nahmst du die Zahl 12 und begannst die Reise:
12 ➜ 6 ➜ 3 ➜ 10 ➜ 5 ➜ 16 ➜ 8 ➜ 4 ➜ 2 ➜ 1
Von der zweiten Zahl (6) an gerechnet brauchte es 9 Schritte bis zur 1, und mit jeder Wiederholung der Regeln veränderte sich die Zahl weiter. Zuerst schien die Folge unberechenbar: mal ging es hinauf, mal hinunter, mal kreuz und quer. Doch die Vermutung besagt, dass wir, egal mit welcher Zahl wir starten, immer bei 1 landen.
Das war faszinierend, aber auch rätselhaft. Warum scheint das immer zu funktionieren? Könnte es eine Zahl geben, bei der der Prozess zusammenbricht, endlos kreist oder ins Unendliche entweicht? Das Notizbuch legte nahe, dass die Lösung etwas Tiefgründiges offenbaren könnte, und wer seine Geheimnisse lüftet, wird mit Ruhm, Reichtum und einem Platz in der Geschichte belohnt.
Gib für eine positive Ganzzahl die Anzahl der Schritte zurück, die nötig sind, um nach den Regeln der Collatz-Vermutung die 1 zu erreichen.
Manchmal ist es notwendig, eine Ausnahme auszulösen. Dabei solltest du immer eine aussagekräftige Fehlermeldung angeben, die zeigt, wo die Fehlerquelle liegt. Das macht deinen Code lesbarer und hilft beim Debuggen deutlich weiter. Wenn du weißt, dass die Fehlerquelle von einem bestimmten Typ ist, kannst du einen der eingebauten Fehlertypen auslösen, solltest aber trotzdem eine aussagekräftige Meldung angeben.
Die Collatz-Vermutung befasst sich nur mit streng positiven Ganzzahlen. Deshalb erwartet diese Übung, dass du die raise-Anweisung verwendest und in deiner Lösung einen ValueError „wirfst“, wenn der übergebene Wert null oder eine negative Ganzzahl ist. Die Tests bestehen nur, wenn du die exception sowohl mit raise auslöst als auch eine Meldung dazu angibst.
Um einen ValueError mit einer Meldung auszulösen, übergibst du die Meldung als Argument an den exception-Typ:
# example when argument is zero or a negative integer
raise ValueError("Only positive integers are allowed")
Melde dich bei Exercism an, um Python mit 17 Konzepte146 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.