Es ist möglich, die Rekursion durch Iteration und unbegrenzten Speicher zu ersetzen .
Wenn Sie nur eine Iteration (etwa while-Schleifen) und eine begrenzte Menge an Speicher haben, ist alles, was Sie haben, ein endlicher Automat. Mit einer endlichen Menge an Speicher hat die Berechnung eine endliche Anzahl möglicher Schritte, so dass es möglich ist, sie alle mit einem endlichen Automaten zu simulieren.
Unbegrenztes Gedächtnis zu haben, verändert den Deal. Dieses unbegrenzte Gedächtnis kann viele Formen annehmen, die sich als äquivalente Ausdruckskraft herausstellen. Eine Turing-Maschine zum Beispiel macht es einfach: Es gibt ein einzelnes Band, und der Computer kann sich auf dem Band nur schrittweise vorwärts oder rückwärts bewegen - aber das reicht aus, um alles zu tun, was Sie mit rekursiven Funktionen tun können.
Eine Turing-Maschine kann als idealisiertes Modell eines Computers (Finite-State-Maschine) mit zusätzlichem Speicher angesehen werden, der bei Bedarf wächst. Beachten Sie, dass es nicht nur wichtig ist, dass das Band nicht begrenzt ist, sondern dass Sie auch bei der Eingabe nicht zuverlässig vorhersagen können, wie viel Band benötigt wird. Wenn Sie vorhersagen (dh berechnen) könnten, wie viel Band von der Eingabe benötigt wird, dann könnten Sie entscheiden, ob die Berechnung anhalten würde, indem Sie die maximale Bandgröße berechnen und dann das gesamte System, einschließlich des jetzt endlichen Bandes, als endliche Zustandsmaschine behandeln .
Eine andere Möglichkeit, eine Turing-Maschine mit Computern zu simulieren, ist die folgende. Simulieren Sie die Turing-Maschine mit einem Computerprogramm, das den Bandanfang im Speicher ablegt. Wenn die Berechnung das Ende des Teils des Bandes erreicht, der in den Speicher passt, ersetzen Sie den Computer durch einen größeren Computer und führen Sie die Berechnung erneut aus.
Angenommen, Sie möchten eine rekursive Berechnung mit einem Computer simulieren. Die Techniken zum Ausführen von rekursiven Funktionen sind gut bekannt: jeder Funktionsaufruf ein Stück Speicher, ein sogenannten Stapelrahmen . Entscheidend ist, dass rekursive Funktionen Informationen durch mehrere Aufrufe verbreiten können, indem sie Variablen weitergeben. In Bezug auf die Implementierung auf einem Computer bedeutet dies, dass ein Funktionsaufruf möglicherweise auf den Stack-Frame eines (grand-) * Elternaufrufs zugreift .
Ein Computer ist ein Prozessor - eine Finite-State-Maschine (mit einer großen Anzahl von Zuständen, aber wir machen hier eine Berechnungstheorie, es kommt also nur darauf an, dass sie endlich ist) - gekoppelt mit einem endlichen Speicher. Der Mikroprozessor führt eine Riesen-While-Schleife aus: "Lies bei eingeschalteter Stromversorgung einen Befehl aus dem Speicher und führe ihn aus". (Echte Prozessoren sind viel komplexer als das, aber es hat keinen Einfluss darauf, was sie berechnen können, nur darauf, wie schnell und bequem sie es tun.) Ein Computer kann mit genau dieser while-Schleife rekursive Funktionen ausführen, um Iteration und den Mechanismus dafür bereitzustellen Zugriff auf den Speicher, einschließlich der Möglichkeit, den Speicher nach Belieben zu vergrößern.
Wenn Sie die Rekursion auf die primitive Rekursion beschränken, können Sie die Iteration auf eine begrenzte Iteration beschränken . Das heißt, anstatt while-Schleifen mit unvorhersehbarer Laufzeit zu verwenden, können Sie for-Schleifen verwenden, bei denen die Anzahl der Iterationen am Anfang der Schleife bekannt ist¹. Die Anzahl der Iterationen ist zu Beginn des Programms möglicherweise nicht bekannt: Sie können selbst durch vorherige Schleifen berechnet worden sein.
Ich werde hier nicht einmal einen Beweis skizzieren, aber es gibt eine intuitive Beziehung zwischen dem Übergang von der primitiven zur vollständigen Rekursion und dem Übergang von for-Schleifen zu while-Schleifen: In beiden Fällen müssen Sie nicht im Voraus wissen, wann Sie sich befinden halt. Bei vollständiger Rekursion wird dies mit dem Minimierungsoperator durchgeführt, in dem Sie so lange weitermachen, bis Sie einen Parameter finden, der die Bedingung erfüllt. Bei while-Schleifen wird dies so lange durchgeführt, bis die Schleifenbedingung erfüllt ist.
for
while
n