Sie müssen anhalten und einen großen Schritt zurück machen.
Der erste Schritt sollte mit der Signatur der Methode kommen. Was ist die Problemstellung?
Suche alle möglichen Pfade
Nicht erwähnt: von einem bestimmten Ausgang koordinieren.
So benötigt das Verfahren einen Satz von Pfaden zurückzukehren:
static Set<Path> AllPaths(Coordinate start) { /* a miracle happens */ }
OK, jetzt kommen wir weiter; Jetzt ist klar, was wir brauchen. Wir brauchen eine Menge Dinge, und wir brauchen einen Pfad, und wir brauchen Koordinaten.
Was ist eine Koordinate?ein Paar Ganzzahlen:
struct Coordinate
{
public int X { get; }
public int Y { get; }
public Coordinate(int x, int y) : this()
{
this.X = x;
this.Y = y;
}
}
Fertig. Also knall den Stapel. Was ist ein Pfad? Ein Pfad kann leer sein, oder es kann ein erster Schritt gefolgt von einem Pfad sein:
Erledigt.
Jetzt implementieren Sie Set<T>
. Sie müssen die Operationen "alle Elemente" und "Union dies mit einem anderen, um ein Drittel zu produzieren" haben. Stellen Sie sicher, dass die Sätze unveränderlich sind. Sie möchten einen Satz nicht ändern, wenn Sie ihm neue Gegenstände hinzufügen. Sie möchten ein anderes Set. Genauso wie du 3 nicht in 4 änderst, wenn du 1 hinzufügst; 3 und 4 sind unterschiedliche Nummern.
Jetzt haben Sie alle Werkzeuge, die Sie benötigen, um das Problem tatsächlich zu lösen; Jetzt können Sie implementieren
static Set<Path> AllPaths(Coordinate start)
{
/* a miracle happens */
}
Also, wie funktioniert das? Denken Sie daran, dass alle rekursiven Funktionen die gleiche Form haben:
- Lösen Sie den trivialen Fall
- Wenn wir nicht in einem trivialen Fall sind, reduzieren das Problem auf einen kleineren Fall lösen sie rekursiv, und kombinieren Lösungen.
Also was ist der triviale Fall?
static Set<Path> AllPaths(Coordinate start)
{
/* Trivial case: if the start coordinate is at the end already
then the set consists of one empty path. */
Implementieren Sie das.
Und was ist der rekursive Fall?
/* Recursive case: if we're not at the end then either we can go
right, go down, or both. Solve the problem recursively for
right and/or down, union the results together, and add the
current coordinate to the top of each path, and return the
resulting set. */
Implementieren Sie das.
Die Lektionen sind hier:
- Machen Sie eine Liste aller Substantive im Problem: set, Weg, koordinieren und so weiter.
- Machen Sie einen Typ, der jede repräsentiert. Halten Sie es einfach und stellen Sie sicher, dass Sie genau die Operationen implementieren, die jeder Typ benötigt.
- Nun, da Sie eine Abstraktion für jedes Substantiv implementiert haben, können Sie damit beginnen, Algorithmen zu entwerfen, die die Abstraktionen verwenden, mit der Gewissheit, dass sie funktionieren.
- Denken Sie an die Grundregeln der Rekursion: Lösen Sie den Basisfall, wenn Sie können; Wenn nicht, lösen Sie die kleineren rekursiven Fälle und kombinieren Sie die Lösungen.
Sie könnten den tatsächlichen Code buchen, da Ihre Bewegungsparameter nicht mit dem Hauptteil der Methode übereinstimmen. Was ich gerade sehe, bewegt sich zuerst nach unten, aber Ihre Kommentare geben den Wunsch an, das Gegenteil zu tun. – RamblinRose
Ich bin nicht sicher, warum Sie alle möglichen Wege brauchen, wäre es nicht besser, den kürzesten Weg zu nehmen, zum Beispiel mit Hilfe des Dijkstra-Algorithmus. Bei größeren Problemen wird die Suche nach allen Pfaden sehr lange dauern. Dann geh einfach zurück und nimm den kürzesten Weg zurück. – Nyranith
Die Erhöhung der y-Koordinate bedeutet, dass Sie auf der rechten Seite fahren, denke ich. – Avan