Ich verstehe die Grundlagen von C ++ gut und verstehe auch, wie Rekursion funktioniert. Ich bin auf bestimmte Probleme gestoßen, wie das klassische Acht-Königinnen-Problem und das Lösen eines Sudoku mit Backtracking.
Mir ist klar, dass ich in dieser Hinsicht ziemlich verloren bin. Ich kann mich anscheinend nicht mit dem Konzept abfinden, wieder in den Rekursionsstapel zurückzukehren und erneut zu beginnen, um das Problem zu lösen. Mit Stift und Papier scheint es einfach zu sein, aber wenn es darum geht, Code dafür zu schreiben, bin ich verwirrt, wie ich anfangen soll, diese Probleme in Angriff zu nehmen.
Es wäre hilfreich, wenn es ein Tutorial für Anfänger zum Zurückverfolgen gäbe oder wenn es ein gutes Buch gäbe, in dem dies behandelt wurde. Wenn jemand Licht in dieses Thema bringen oder mir Links zu anständigen Referenzen geben kann, wäre ich sehr dankbar.
Und ja, ich weiß, dass es in funktionalen Sprachen einfacher ist, aber ich möchte die Implementierung auch in imperativen Sprachen verstehen.
Antworten:
Beim Backtracking fängst du nicht wieder an. Stattdessen durchlaufen Sie alle Optionen in der aktuellen Situation.
Denken Sie darüber nach, eine Lösung für ein Labyrinth zu finden. An einem Punkt, an dem Sie zwei verschiedene Pfade haben, versuchen Sie zuerst den linken. Wenn der linke nicht zum Ausgang führt, kehren Sie zum Punkt zurück und versuchen den anderen Weg. So funktioniert Backtracking. In 8 Q und anderen Problemen, bei denen Backtracking verwendet werden kann, liegt der verwirrende Teil in der Problemdomäne - wie Sie Ihre Optionen in einer bestimmten Situation deterministisch durchlaufen können.
BEARBEITEN : Das Folgende ist ein Pseudocode, der das Verständnis von Backtracking erleichtert.
Für 8Q frage:
quelle
Sie haben ein Programm gesehen, um einen binären Baum zu durchlaufen, richtig? Es sieht aus wie das:
Da ist dein Backtracking.
Du brauchst eigentlich keinen physischen Baum. Alles, was Sie brauchen, ist eine Möglichkeit, einen Zug zu machen und ihn später rückgängig zu machen oder zu sagen, ob Sie gewonnen haben oder ob Sie nicht weiter gehen können.
quelle
else{return walk(p->left)||walk(p->right));}
keine Notwendigkeit für das erwartete Ergebnis zu werfen