Hach ja, Rekursion, das Lieblingstierchen jedes Programmierers. Sicher ist sowas auch in Batchdateien möglich (Ich versuche übrigens immer noch Turingvollständigkeit nachzuweisen :-)).
Der erste zaghafte Test wäre erstmal eine unendliche Rekursion:
Und siehe da, sie funktioniert:
Genau das, was wir haben wollten. Etwas sinnvolleres als einen Stacküberlauf hatten wir uns ohnehin nicht erhofft. Also offensichtlich kann cmd Rekursion.
Dann sollten wir das auch mal mit einem zumindest ansatzweise praxisbezogenem Problem testen: Fakultäten. Ungeachtet dessen, daß man die besser iterativ berechnet. Wir wollen aber nur sicherstellen, daß die Rekursion vernünftig funktioniert:
Wir brauchen hier leider eine temporäre Variable, da cmd keine Berechnungen
ohne SET /A erlaubt, aber ansonsten sieht es in
etwa so aus, wie es sollte. Der Rekursionsabbruch wurde am Anfang des
Unterprogramms durch ein IF
abgefangen, leider gibt es keine funktionalen Nettigkeiten wie verschiedene
Funktionsdefinitionen hier.
Und funktioniert das nun auch? Aber sicher:
Mein Taschenrechner sagt mir sogar, daß die Werte richtig sind. 12! ist leider die höchste Fakultät, die man damit berechnen kann, da wir auf 32-bittige vorzeichenbehaftete Ganzzahlen beschränkt sind. Ein kleiner Fehler ist noch vorhanden, wenn man negative Zahlen als Argument angibt (wieder eine unendliche Rekursion). Das ist allerdings in der angehängten Version behoben, ebenso bekommt man in selbiger eine hilfreiche Nachricht, wenn man die Batch ohne Parameter aufruft.
Und nur so nebenbei, eine nette Variante, Fakultäten zu berechnen, indem wir einfach den eingebauten „Taschenrechner“ von cmd benutzen:
Wir basteln uns hier einfach die komplette Berechnung in einer Zeile zusammen
und lassen die dann von SET
/A auswerten. Nichts großartig aufregendes aber wahrscheinlich
schneller als Rekursion.
| Anhang | Größe |
|---|---|
| Test für unendliche Rekursion | 28 Bytes |
| Rekursive Berechnung der Fakultät | 486 Bytes |
| Nichtrekursive Berechnung der Fakultät | 163 Bytes |
Kommentare
Neuen Kommentar abgeben