Rekurs brief-muster

Beachten Sie die Verwendung der Kurzschlussauswertung der booleschen && (AND) Operatoren, so dass der rekursive Aufruf nur erfolgt, wenn der Knoten gültig ist (nicht Null). Beachten Sie, dass der erste Begriff im AND zwar ein Zeiger auf einen Knoten ist, der zweite Begriff jedoch ein bool ist, sodass der Gesamtausdruck zu einem bool ausgewertet wird. Dies ist ein gängiges Idiom im rekursiven Kurzschluss. Dies ist zusätzlich zur Kurzschlussauswertung der booleschen || (ODER) Operator, um nur das richtige Kind zu überprüfen, wenn das linke Kind ausfällt. Tatsächlich kann der gesamte Steuerungsfluss dieser Funktionen durch einen einzelnen booleschen Ausdruck in einer Rückgabeanweisung ersetzt werden, aber die Lesbarkeit leidet unter keinem Nutzen für die Effizienz. Die meisten grundlegenden Beispiele der Rekursion und die meisten der hier vorgestellten Beispiele zeigen die direkte Rekursion, in der sich eine Funktion selbst aufruft. Indirekte Rekursion tritt auf, wenn eine Funktion nicht von selbst aufgerufen wird, sondern von einer anderen Funktion, die sie aufgerufen hat (entweder direkt oder indirekt). Wenn z. B. f f aufruft, ist das eine direkte Rekursion, aber wenn f g aufruft, was f aufruft, dann ist das eine indirekte Rekursion von f.

Ketten von drei oder mehr Funktionen sind möglich; So ruft z.B. Funktion 1 Funktion 2 auf, Funktion 2 ruft Funktion 3 auf und Funktion 3 ruft Funktion 1 erneut auf. Rekursive Multiplikationsprobleme sind von Natur aus rekursiv, da sie aufgrund des vorherigen Zustands, den sie nachverfolgen müssen, nachverfolgen müssen. Ein Beispiel ist die Baumdurchquerung wie bei der Tiefensuche. Obwohl sowohl rekursive als auch iterative Methoden verwendet werden,[19] stehen sie im Gegensatz zu Listendurchquerung und linearer Suche in einer Liste, die eine singive rekursive und daher natürlich iterative Methode ist. Weitere Beispiele sind Divide-and-Conquer-Algorithmen wie Quicksort und Funktionen wie die Ackermann-Funktion. Alle diese Algorithmen können iterativ mit Hilfe eines expliziten Stacks implementiert werden, aber der Programmieraufwand bei der Verwaltung des Stacks und die Komplexität des resultierenden Programms überwiegen wohl alle Vorteile der iterativen Lösung. Als konkretes Beispiel hängt der Leistungsunterschied zwischen rekursiven und iterativen Implementierungen des obigen „faktoriellen“ Beispiels stark vom verwendeten Compiler ab.

In Sprachen, in denen Looping-Konstrukte bevorzugt werden, kann die iterative Version so viel wie mehrere Größenordnungen schneller als die rekursive sein. In den Funktionssprachen kann der Gesamtzeitunterschied der beiden Implementierungen vernachlässigbar sein; in der Tat können die Kosten für die Multiplikation der größeren Zahlen zuerst anstatt der kleineren Zahlen (was die hier angegebene iterative Version zufällig tut) jede Zeit, die durch die Auswahl der Iteration gespart wird, überfordern. Die meisten Programmiersprachen, die heute verwendet werden, ermöglichen die direkte Spezifikation rekursiver Funktionen und Verfahren. Wenn eine solche Funktion aufgerufen wird, verfolgt die Laufzeitumgebung des Programms die verschiedenen Instanzen der Funktion (häufig mit einer Aufrufliste, obwohl andere Methoden verwendet werden können). Jede rekursive Funktion kann in eine iterative Funktion umgewandelt werden, indem rekursive Aufrufe durch iterative Steuerungskonstrukte ersetzt und die Aufrufliste mit einem Stapel simuliert wird, der explizit vom Programm verwaltet wird. [11] [12] In der Softwareentwicklung ist ein Muster (oder Designmuster) ein schriftliches Dokument, das eine allgemeine Lösung für ein Entwurfsproblem beschreibt, das in vielen Projekten wiederholt auftritt. Software-Designer passen die Musterlösung an ihr spezifisches Projekt an. Muster verwenden einen formalen Ansatz, um ein Entwurfsproblem, seine vorgeschlagene Lösung und alle anderen Faktoren zu beschreiben, die sich auf das Problem oder die Lösung auswirken könnten. Ein erfolgreiches Muster hätte sich in drei früheren Projekten oder Situationen zu einer guten Lösung entwickeln müssen.

Da die Anzahl der Dateien in einem Dateisystem variieren kann, ist rekursibilission die einzige praktische Möglichkeit, den Inhalt zu durchlaufen und damit aufzuzählen. Das Durchlaufen eines Dateisystems ähnelt dem der Baumdurchquerung, daher sind die Konzepte hinter der Baumdurchquerung auf das Durchlaufen eines Dateisystems anwendbar.

Dieser Eintrag wurde veröffentlicht in Allgemein. Lesezeichen auf den Permanentlink.