====== LU01.A12 - Trace Table für die Collatz-Folge ====== Erstellen Sie einen Trace Table für einen Algorithmus mit ''while''-Schleife, bei dem sich der Parameter selbst laufend verändert – und vergleichen Sie ihn mit der rekursiven Fassung desselben Algorithmus. ===== Erklärung der Collatz-Folge ===== Die Collatz-Folge (auch //(3n+1)-Problem//) folgt einer verblüffend einfachen Regel. Man startet mit einer positiven ganzen Zahl und wiederholt: * Ist die Zahl **gerade**, halbiere sie. * Ist die Zahl **ungerade**, multipliziere sie mit 3 und addiere 1. Man hört auf, sobald die Zahl 1 erreicht ist. Ob das für //jede// Startzahl passiert, ist bis heute unbewiesen – ausprobieren kann man es trotzdem. ===== Algorithmus ===== def collatz(n): schritte = 0 while n != 1: if n % 2 == 0: n = n // 2 else: n = 3 * n + 1 schritte += 1 return schritte if __name__ == '__main__': start = 6 print(f'Von {start} bis 1 sind es {collatz(start)} Schritte.') ===== Aufgabe ===== * Analysieren Sie den Code Schritt für Schritt für den Startwert ''n = 6''. * Erstellen Sie einen Trace Table mit dem Wert von ''n'' **vor** und **nach** dem Schritt, dem Ergebnis der Bedingung und dem Zählerstand. * Verwenden Sie die folgende Struktur: ^ Schritt ^ n (vorher) ^ n % 2 == 0 ^ angewandte Regel ^ n (nachher) ^ schritte ^ | 1 | 6 | Ja | n // 2 | 3 | 1 | | 2 | | | | | | * Führen Sie die Tabelle fort, bis die Schleifenbedingung ''n != 1'' nicht mehr erfüllt ist. ==== Beispielinput ==== start = 6 ==== Beispieloutput ==== Von 6 bis 1 sind es 8 Schritte. ===== Teil 2: Dieselbe Berechnung ohne veränderliche Variablen ===== Die folgende Fassung berechnet dasselbe, verändert aber keine einzige Variable. Der Zustand wandert stattdessen durch die Parameter der rekursiven Aufrufe. def collatz_rekursiv(n, schritte=0): if n == 1: return schritte if n % 2 == 0: return collatz_rekursiv(n // 2, schritte + 1) return collatz_rekursiv(3 * n + 1, schritte + 1) Erstellen Sie auch dafür einen Trace Table: ^ Aufruf ^ n ^ schritte ^ nächster Aufruf ^ Rückgabewert ^ | 1 | 6 | 0 | collatz_rekursiv(3, 1) | | | 2 | | | | | **Hinweis zur Rückgabespalte** Füllen Sie die Spalte //Rückgabewert// erst von unten nach oben aus. Der innerste Aufruf liefert seinen Wert zurück, und dieser Wert wird von jedem darüberliegenden Aufruf unverändert weitergereicht. ===== Auswertungsfragen ===== - Welche Spalten des ersten Trace Tables werden im zweiten überflüssig? Was sagt das über den Unterschied zwischen veränderlichem Zustand und Parameterübergabe aus? - Im ersten Algorithmus bezeichnet ''n'' nacheinander acht verschiedene Zahlen. Im zweiten hat jedes ''n'' innerhalb seines Aufrufs genau einen Wert und behält ihn. Warum ist die zweite Variante leichter nachzuvollziehen? - Was passiert bei ''collatz(0)''? Erklären Sie, warum – und welche der beiden Fassungen den Fehler früher sichtbar macht. - Prüfen Sie Ihre Tabelle mit dem Startwert ''n = 7''. Wie viele Schritte sind es? Warum braucht eine so kleine Zahl so viele Schritte? ===== Abgabe ===== Geben Sie beide ausgefüllten Trace Tables und die beantworteten Auswertungsfragen in Moodle ab. ---- {{tag>M323-LU01 M323-C1B M323-A1I}} [[https://creativecommons.org/licenses/by-nc-sa/4.0/ch/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] (c) Kevin Maurizi