Rekursive Functions in PowerShell

Eine rekursive Function ist eine Function, die sich selber aufruf. Warum sollte sie das tun? Damit ein Befehlsfolge eine beliebige Anzahl oft wiederholt werden kann. Im Unterschied zu seiner Schleife wiederholt sich die Befehlsfolge selber. Eine praktische Anwendung ist eine Verzeichnissuche – nicht immer gibt es einen Recurse-Parameter oder ein Cmdlet wie Get-ADuser, das eigentlich Find-ADUser heißen müsste, da es eine Suche in der gesamten (Verbund-) Verzeichnisstruktur durchführt.

Rekursive Functions sind grundsätzlich sehr einfach – das Problem liegt in erster Linie darin, sich eine Abbruchbedingung zu überlegen. Außerdem ist das Konzept vielen zu abstrakt, so dass sie lieber die „iterative“ Variante in Gestalt einer regulären Schleife bevorzugen.

Ein einfaches Beispiel zur Einstimmung ist die Berechnung der Fakultät einer ganzen Zahl, da hier lediglich bei der Zahl 1 beginnend eine Zahl mit der um eins größeren Zahl multipliziert wird.

Aufgerufen wird die Function wie folgt:

Etwas kniffliger ist die Berechnung einer Fibonacci-Zahlenfolge, bei der eine folgende Zahl aus der Summe ihrer beiden Vorgängerzahlen gebildet wird. Also die Reihenfolge 0 1 1 2 3 5 8 13 21 34 55 usw. entsteht. Offiziell lautet die Berechnungsformel fib(n-1) + fib(n-2), wobei die Zahl n >= 2 sein muss. Mit dieser Formel ist die Umsetzung relativ einfach im Gegensatz zum Hochzählen von n was mir auch nach längerem Herumprobieren nicht gelungen ist.

Hier ist die Umsetzung der „einfachen“ Variante mit Abbruchbedingung n = 0 und n = 1.

Bei z 0 und bei z = 1 bricht die Function jeweils mit den Werten 0 und 1 ab, die auf den Rückgabewert aufaddiert werden. Ungewohnt und für Jemanden, der mit der typischen „Programmierer-Logik“ noch nicht viel zu tun hat, auch reichlich verwirrend dürfte der Umstand sein, dass für den Rückgabewert keine Variable im Spiel ist und dieser einfach aus der Function selber entsteht. Der break-Befehl verlässt nicht die Function, sondern nur den switch-Befehl. Da in diesem Fall aber die Function nicht erneut aufgerufen wird, entspricht dies indirekt einem Abbruch der Function. Einfach und genial. Ein return-Befehl ist offiziell nicht erforderlich, wäre aber sinnvoll, damit die Function etwas besser nachvollziehbar wird.

Aufgerufen wird die Function wie folgt:

Es ist faszienierend wie lange die Berechnung bei etwas größeren Zahlen dauert. Bereits mit z = 100 dauert die Berechnung „ewig“ – und das auf einer halbwegs modernen 4-Kerne-CPU.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

This site uses Akismet to reduce spam. Learn how your comment data is processed.