Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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!

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

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

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

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

Das ist aber meine Problemstellung :)

Die Richtung, wie das Skript auf die Verbindung kommt, ist, wie von dir geschrieben, egal.

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.

Ok, also eine Liste führen. Vielen Dank!

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.