Batch-Tricks: Rekursion

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:

@ECHO OFF
:JUMP
CALL :JUMP

Und siehe da, sie funktioniert:

******  B A T C H   R E C U R S I O N  exceeds STACK limits ******
Recursion Count=599, Stack Usage=90 percent
******       B A T C H   PROCESSING IS   A B O R T E D      ******

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:

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

CALL :fac %1
ECHO %RETURN%

:end
ENDLOCAL
GOTO :EOF

:fac
IF %1==0 (
        SET RETURN=1
        GOTO :EOF
)
SET /A TEMP=%1 – 1
CALL :fac %TEMP%
SET /A RETURN*=%1
GOTO :EOF

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:

> fac 5
120
> fac 10
3628800

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:

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET TEMP=1
FOR /L %%i IN (1,1,%1) DO SET TEMP=!TEMP! * %%i
SET /A TEMP=%TEMP%
ECHO %TEMP%
ENDLOCAL

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.

AnhangGröße
Test für unendliche Rekursion28 Bytes
Rekursive Berechnung der Fakultät486 Bytes
Nichtrekursive Berechnung der Fakultät163 Bytes

Kommentare

Neuen Kommentar abgeben

The content of this field is kept private and will not be shown publicly.