das problem bei einem funktionsaufruf wie deinem ist, das die funktion beim rekusionsvorgang noch nicht beendet ist.
erstellen wir ein einfaches vergleichsbeispiel:
Code:
Rekursion()
Func Rekursion($a=0)
If $a>=10 Then Return 1
Rekursion($a+1)
EndFunc
so können wir durch zwei einfache ausgaben eindeutig sehen, das es bei dieser rekursionsform eine hin und eine rückrichtung gibt:
Code:
Rekursion()
Func Rekursion($a=0)
If $a>=10 Then Return 1
ConsoleWrite('Hin: '&$a&@CRLF)
Rekursion($a+1)
ConsoleWrite('Rück: '&$a&@CRLF)
EndFunc
das ganze läuft dann folgendermaßen ab...
Code:
- Rekursion wird ohne parameter aufgerufen -> $a=0
- es wird geprüft ob $a >= 10 ist -> $a<10
- es wird "Hin: $a" ausgegeben
- Rekursion wird mit incrementiertem $a aufgerufen
- da die funktion nicht beendet ist (weder EndFunc noch Return noch Exit wurden aufgerufen)
muss der aktuelle zustand der funktion im stack abgelegt werden, um sie später fortzusetzen
- durchführung von Rekursion mit inkrementiertem $a
- ... wiederholt sich bis $a>=10 ist ...
- Return greift, die funktionen werden in umgekehrter reihenfolge zuende ausgeführt ($a dekrementiert in jedem schritt, bis wir wieder beim ausgangszustand sind)
setzen wir hier keinen ausstiegspunkt der rekursion, so wird in jedem durchlauf erneut der stack belasted, bis er irgendwann sein limit erreicht hat.
theoretisch könnten wir das ganze problem mit einem einfachen zusatzbefehl lösen:
Code:
Rekursion()
Func Rekursion($a=0)
If $a>=10 Then Return 1
ConsoleWrite('Hin: '&$a&@CRLF)
Return Rekursion($a+1)
ConsoleWrite('Rück: '&$a&@CRLF)
EndFunc
da die funktion beim erneuten aufruf von Rekursion bereits beendet ist, braucht hier nichts im stack gespeichert werden. (der rückweg ist ja abgeschnitten)
leider ist der interpreter von autoit aber nicht in der lage dies zu erkennen und sichert den aktuellen zustand trotzdem im stack, wodurch auch dies praktisch zu keinem erfolg führt. somit sind wir in autoit leider auf die verwendung von iterativen endlosschleifen beschränkt.