3.4 \(\mu\)-Rekursion
Primitive Rekursion erlaubt uns Schleifen, allerdings nur in einer sehr restriktiven Form:- Wir müssen anfangs bereits angeben, wie oft wir die Schleife durchlaufen wollen;
- wir dürfen nur eine lokale Variable mitführen (und den Iterationsindex).
Die Collatz-Vermutung
Wir definieren eine Funktion $f: \N_+ \rightarrow \N_+$ wie folgt:
\begin{align*} f : \N_+ & \rightarrow \N_+ \\ n & \mapsto \begin{cases} n/2 & \textnormal{ if $n$ even} \\ 3n+1 & \textnormal{ if $n$ odd.} \end{cases} \end{align*}Für eine natürliche Zahl $n$ können wir dann die Collatz-Folge definieren: $n, f(n), f(f(n)), ...$. Man sieht leicht, dass diese Folge in einer Schleife landen kann:
\begin{align*} 13 \mapsto 40 \mapsto 20 \mapsto 10 \mapsto 5 \mapsto 16 \mapsto 8 \mapsto 4 \mapsto 2 \mapsto 1 \mapsto 4 \mapsto 2 \mapsto 1 \dots \end{align*}Wir beenden die Sequenz daher üblicherweise, wenn wir bei 1 (und somit in dieser Dreierschleife) gelandet sind. Es kann allerdings etwas länger dauern:
Experimentieren Sie! Ich habe dafür die Html-Seite collatz.html erstellt. Es scheint: egal, wo Sie anfangen, Sie enden immer bei 1. Allerdings wissen wir nicht im Voraus, wie oft wir die Funktion $f$ anwenden müssen. Und wir wissen nicht einmal, ob man immer bei 1 ankommt, ob es andere Zyklen gibt oder ob es Startwerte gibt, für die die Folge einfach nach Unendlich divergiert. Bis zum heutigen Tage (Stand 30. April 2024) hat sich die Collatz-Vermutung zahlreichen Lösungsversuchung widersetzt und demonstriert eindrucksvoll, dass auch mathematische Probleme mit sehr einfacher Formulierung extrem schwierig sein können.
While-Schleifen
Eine Einschränkung primitiv-rekursiver Funktionen ist also, dass wir immer vor der Schleife
angeben müssen, wie oft diese durchlaufen werden soll. Es gibt also keine
while-Schleifen. Führen wir diese nun ein.
def While (condition, step):def f(x):temp = xwhile (condition(temp)):temp = step(temp)return tempreturn f
Übungsaufgabe
Schreiben Sie mit Hilfe von While, PrimRec und Comp
eine Funktion collatzList, die aus einer Zahl
die Collatz-Folge baut, also
collatzList(7)[]