KAPITEL 17. SCHNELLEINSTIEG IN LUA
Rekursive Funktionen bieten oftmals elegante und was Code Zeilen anbelangt
- kompakte Lösungen. Sie haben allerdings ihren Preis.
Betrachten Sie dazu den faculty Code. Mit jeder Erhöhung der übergebe-
nen Zahl n wächst die Rekursionstiefe. Für eine Programmiersprache bedeu-
tet dies: Jedes mal wenn eine Funktion aufgerufen wird und nicht zurückkehrt
erhöht sich der Stack Verbrauch
braucht stürzt das Programm in der Regel ab!
Sie können natürlich die Rekursionstiefe limitieren indem Sie für n nur eine
maximale Größe zulassen. Dieser Ansatz erfordert aber ein diszipliniertes Ver-
halten für jeden Programmierer - und wird gerne einmal vergessen.
Zum Glück besitzt die Lua Implementierung der Analyser Software einen inte-
grierten 'Wächter'. Ändern Sie dazu den Aufruf in Zeile 9 zu:
p r i n t ( f a c u l t y ( 30 ) )
Die Analyzer Software limitiert die maximale Rekursionstiefe auf einen Wert
der einen guten Kompromiss zwischen Speicherverbrauch und Prozessor Last
darstellt.
Dies ist besonders wichtig wenn Sie Protokoll Templates erstellen die in Echt-
zeit ausgeführt werden!
Die meisten rekursiven Funktionen können auch nicht-rekursiv implementiert
werden. Eine alternative faculty Funktion könnte so aussehen:
1
function f a c u l t y _ n o n _ r e c u r s i v e ( n )
2
l o c a l sum = 1
3
i f n <= 1 then
4
r e t u r n 1
5
else
6
f o r i =2 ,n do
7
sum = sum
end
8
end
9
r e t u r n sum
10
end
11
12
13
p r i n t ( f a c u l t y _ n o n _ r e c u r s i v e ( 100 ) )
Diese Variante konsumiert hauptsächlich Prozessor Zeit. Der Stack Verbrauch
ist minimal, verwendet werden lediglich die Variablen sum und der Iterator Zäh-
ler i.
17.2.12
Module
Ein Modul ist ein Zusammenstellung von Funktionen für bestimmte Zwecke.
Sie kennen bereits das Modul string, math und table. Daneben existieren
spezielle - Analyser spezifische - Module welche nicht Teil des Standard Lua
sind. Wir beschreiben diese in einem eigenen Kapitel 18.
Und: Vergessen Sie nicht Ihre eigenen in Lua geschriebenen Module wie unser
checksum Beispiel zuvor.
9
Der Stack ist Teil des normalen Speichers und dient u.a. zur Speicherung der lokalen Variablen
in Funktionen.
218
9
. Ist der verfügbare Stack Speicher aufge-
> [ s t r i n g "
[ [ . . . " ] : 1 1 : s t a c k o v e r f l o w
i
> 9 ,3326215443944e+157