Zum Inhalt springen

Backtracking bei verzweigender Rekursion


petter2

Empfohlene Beiträge

Hallo!

Folgendes Problem:


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

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich verstehe das Problem nicht, evtl machst Du mal eine Graphik, wie der Baum aussieht. Beim Backtracking wird bei einem Fehler der Zweig so lange wieder aufwärts durchlaufen bis an einem Knoten eine noch nicht bearbeite Möglichkeit entsteht, siehe Backtracking

Wenn wie im Bild der Code 1,8,12 läuft, 12 einen Fehler produziert, dann geht er auf die 8, geht in die 9 usw. wenn die 9 abgearbeitet ist, geht er in die 8 und 1. Die Reihenfolge legt die Traversierung fest

Link zu diesem Kommentar
Auf anderen Seiten teilen

post-84253-14430449158483_thumb.png

Vielen Dank für Deine Antwort!

Ich habe mal versucht mit Paint das darzustellen. Wenn das Programm auf ein Problem trifft, soll er so lange zurück gehen, bis eine andere Möglichkeit vorhanden ist (das ist in der Grafik nicht ersichtlich). Meine Frage ist jetzt, wie ich die Blau markierten Felder wieder "leeren" kann, da da ja durch die andere Entscheidung auch wiederrum alles ändern kann.

Vielen Dank!

EDIT:

Wird aber deutlich komplizierter, z.B. hier, zurück bis auf 2:

post-84253-14430449158792_thumb.png

Bearbeitet von petter2
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah okay. Also da es ja bei Dir wie ein Binärbaum aussieht, würde ich gar nicht zu einem Baum tendieren, sondern diesen linear ablegen ( Binärbaum ), damit kannst Du die Positionen der Blätter direkt anspringen und ggf ändern. Falls es eben kein Binärbaum ist, kannst Du Dir während der Traversierung Pointer auf die Knoten / Blätter speichern, so dass Du eben bei einem Fehler alle bisher durchlaufenen Knoten / Blätter direkt verändern kannst.

In C++ würde ich eben einen std::vector<node*> anlegen und bei jedem durchlaufen des Knotens diesen des Vectors hinzufügen, wenn ein Fehler auftritt kann man dann diese Liste durchlaufen und verarbeiten. Letzteres würde auch mit einer beliebigen Art eines Baumes funktionieren, erfordert aber halt eine zusätzliche Datenstruktur, die so viele Elemente enthält, wie es Knoten im Baum gibt, wenn der Baum vollständig / ohne Fehler aufgebaut wird

Bearbeitet von flashpixx
Link zu diesem Kommentar
Auf anderen Seiten teilen

OK, danke!

Jede Verbindung braucht eine Pfeilrichtung. Jedes Kästchen hat aber ein bestimmtes Limit, wie viel Pfeile dort hinzeigen dürfen. Fällt einem dazu vielleicht noch etwas ein?

Die Verbindungen und Kästchen sind in zwei Arrays.

Bearbeitet von petter2
Link zu diesem Kommentar
Auf anderen Seiten teilen

Wo ist das Problem !? Für jeden Knoten wird entschieden, ob diese nun einen Fehlerzustand true / false hat, wenn der Zustand true ist, dann können alle Knoten, die bis zu diesem verarbeitet wurden, nochmals besucht werden, in dem man eine eben die Liste mitführt. Welche Knoten in der Liste landen, legt die Traversierung fest.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...