Backtracking bei verzweigender Rekursion

  • Hallo!
    Folgendes Problem:

    [autoit][/autoit][autoit][/autoit][autoit]

    Func Funktion($a)
    If Fehler() Then Return -1
    ; Funktion
    ; ...
    For $a in $b ; Bedingung für weitere Durchführungen
    $erfolgreich = Funktion($a)
    If $erfolgreich == -1 Then
    ; Funktion rückgängig machen
    ; ...
    Return -1
    EndIf
    Next
    Return 1
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit]

    Angenommen, er geht das erste mal in die Funktion hinein. Die zweite Ebene durchläuft er auch, der erste Zweig ist erfolgreich und er kommt wieder zurück, beim zweiten Zweig gibt es einen Fehler. Dann löscht er auch die erste Ebene. Aber was muss man wie programmieren, damit er auch die Entscheidungen von der zweiten Ebene vom ersten Zweig löscht (das ist ja auch verzweigt und verschachtelt)?

    Ich hoffe ich habe mich verständlich ausgedrückt, ansonsten bitte Fragen.
    Vielen Dank!

  • Moin,

    Das klingt ja nach einer "Rückgängig" Funktion ... nein im Ernst ..

    Ich löse dies indem ich meine Werte, Berechnungen etc halt in Zwischenvariablen mache - und erst ganz am Ende der Funktion wenn alles Glatt gelaufen ist, übertrage ich die Werte in die eigentlichen..

    Mhh, ich hoffe der Satz ist verständlich ...

    Wen ich mit vielen Funktionen arbeite nutze ich eine Globale Variable um einen Fehler (oder einen Abbruch des Benutzers) über alle Funktionen zu erkennen.
    Ich setzte als am Anfang ein

    [autoit]

    $bAllesOK = True

    [/autoit]


    Wenn eine Komponente einen Fehler hat setzt sie diese auf "False".
    Vor allen wichtigen Sachen, am Anfang von Funktionen etc prüfe ich zuvor die $bAllesOK.
    Am Ende des Abschnitts gebe ich dann die Rückgabewerte wenn alles ok ist - oder eben nicht. Kann auch nocht um fehlertext ergänzt werden

    BLinz