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.
Die Collatz-Folge (auch (3n+1)-Problem) folgt einer verblüffend einfachen Regel. Man startet mit einer positiven ganzen Zahl und wiederholt:
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.
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.')
n = 6.n vor und nach dem Schritt, dem Ergebnis der Bedingung und dem Zählerstand.| Schritt | n (vorher) | n % 2 == 0 | angewandte Regel | n (nachher) | schritte |
|---|---|---|---|---|---|
| 1 | 6 | Ja | n // 2 | 3 | 1 |
| 2 |
n != 1 nicht mehr erfüllt ist.start = 6
Von 6 bis 1 sind es 8 Schritte.
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.
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?collatz(0)? Erklären Sie, warum – und welche der beiden Fassungen den Fehler früher sichtbar macht.n = 7. Wie viele Schritte sind es? Warum braucht eine so kleine Zahl so viele Schritte?