Freigeben über


Rekursive Prozeduren

Aktualisiert: November 2007

Rekursive Prozeduren sind Prozeduren, die sich selbst aufrufen. Im Allgemeinen ist dies nicht die effizienteste Art und Weise, Visual Basic-Code zu schreiben.

Die folgende Prozedur berechnet die Fakultät ihres ursprünglichen Arguments mithilfe der Rekursion.

Function factorial(ByVal n As Integer) As Integer
    If n <= 1 Then
        Return 1
    Else
        Return factorial(n - 1) * n
    End If
End Function

Überlegungen hinsichtlich rekursiver Prozeduren

Einschränkende Bedingungen. Sie müssen eine rekursive Prozedur so gestalten, dass sie mindestens eine Bedingung überprüft, mit der die Rekursion beendet wird. Berücksichtigen Sie auch den Fall, dass eine solche Bedingung auch nach einer hinlänglichen Anzahl rekursiver Aufrufe nicht erfüllt wird. Wenn nicht mindestens eine Bedingung gegeben ist, die fehlerfrei erfüllt werden kann, dann besteht die Gefahr, dass die Prozedur in einer Endlosschleife ausgeführt wird.

Speichernutzung. Anwendungen verfügen nur beschränkt über Speicherplatz für lokale Variablen. Jedes Mal, wenn eine Prozedur sich selbst aufruft, verbraucht sie mehr von diesem Platz für zusätzliche Kopien ihrer lokalen Variablen. Wenn sich dieser Vorgang unendlich lange fortsetzt, wird letztendlich ein StackOverflowException-Fehler ausgelöst.

Effizienz. Rekursion lässt sich fast immer durch eine Schleife ersetzen. Eine Schleife ist nicht mit dem Verwaltungsaufwand verbunden, den das Übergeben von Argumenten, das Initialisieren von zusätzlichem Speicher und das Zurückgeben von Werten bedeutet. Das Leistungsverhalten kann ohne rekursive Aufrufe u. U. viel besser sein.

Gegenseitige Rekursion. Sie werden ein sehr schlechtes Leistungsverhalten feststellen oder sogar eine Endlosschleife finden, wenn zwei Prozeduren einander aufrufen. Eine solche Konstellation verursacht die gleichen Probleme wie eine einzelne rekursive Prozedur, ist aber möglicherweise schwerer zu erkennen und zu debuggen.

Aufrufe mit Klammern. Wenn eine Function-Prozedur sich rekursiv aufruft, müssen auch dann nach dem Prozedurnamen runde Klammern angegeben werden, wenn keine Argumentliste vorhanden ist. Anderenfalls wird der Funktionsname als Rückgabewert der Funktion gedeutet.

Testen. Beim Schreiben einer rekursiven Prozedur sollten Sie sehr sorgfältig testen, ob die Prozedur stets eine einschränkende Bedingung erfüllt. Sie sollten auch sicherstellen, dass der Arbeitsspeicher nicht durch zu viele rekursive Aufrufe erschöpft wird.

Siehe auch

Aufgaben

Verfahren zur Problembehandlung

Problembehandlung bei Ausnahmen: System.StackOverflowException

Konzepte

Prozeduren in Visual Basic

Sub-Prozeduren

Function-Prozeduren

Property-Prozeduren

Operatorprozeduren

Parameter und Argumente von Prozeduren

Prozedurüberladung

Schleifenstruktur

Referenz

StackOverflowException