Java | Rekursion?
Hallo! Ich komme bei diesem Problem nicht weiter.
Wir haben eine Methode, welche sich Rekursiv wieder im Code aufruft, um zu eine Wand zu fahren.
Nun soll dieser wieder zurück auf das Feld fahren, auf welchem dieser ehemalig stand. Die Nutzung von Schleifen ist weiterhin nicht erlaubt.
public void zurwand(){
if(!wandVorhanden("vorne")){
fahre();
zurWand();
}else{
drehe("links");
drehe("links");
}
}
2 Antworten
Nachdem innerhalb der Methode die Methode zurWand selber aufgerufen wird geht es ja weiter, sobald man das erste Mal in dem else-Block landet und somit die Methode nicht weiter aufgerufen wird. Nachdem man mit zurWand fertig ist, steht man nach den Umdrehungen schon in der richtigen Richtung. Also braucht man danach nur ein weiteres fahre(); welches dann je Rekursionsstufe ausgeführt wird.
Irgendwann wird zurWand zum letzten Mal aufgerufen. Und wenn man danach fahre(); platziert, wird dieses fahre genau so oft aufgerufen, wie das fahre vor zurWand();.
Mein Fehler, ich meinte, dass man ein fahre(); unter zurWand(); einbauen muss.
Danke! Habs einigermaßen verstanden
Ich habe noch eine Frage.. Nach dem diese Methode x mal rekursiv aufgerufen wurde, macht diese ja normal mit dem Ablauf der Funktion weiter. Nur wieso ruft er das "fahre" dann noch x mal auf? Eigentlich müsste dieser das doch nur einmal ausführen?
So hab's jetzt komplett verstanden! Hab mir das 5/6 mal angeschaut und man kann es sich so vorstellen, wie eigenständige Instanzen der Methode, welche danach normal weiter machen und sich dann schließen.
Vielen Dank.
btw kann sein dass meine Erklärung verwirrend ist
Gerne.
Ich habe gerade überlegt, wie ich das noch besser erklären kann. Gut, dass du es auch so verstanden hast.
Hallo nochmals. Wenn dieser jetzt eine Marke auf dem letzten Feld platzieren soll, wie mache ich das? Immerhin, wenn ich den in die Abbruchbedingung, oder nach der Funktion schreibe, wird diese ja so ausgeführt, dass auf jedem Feld zurück eine Marke platziert wird. platziereMarke(); ist dafür die Methode.
Der else-Block wird nur bei der Drehung um 180° ausgeführt. Wenn man platziereMarke(); da platzieren würde, würde also nur das Feld vor der Wand markiert werden.
Hast du die komplette Aufgabe? Falls ja wäre es hilfreich die mal nachlesen zu können. Im Beispiel kann man ja eine Bedingung festlegen bei der die Rekursion irgendwann aufhört.
Ganz blöd würde ich sagen, du baust dir in die if Abfrage eine Bedingung wie im Beispiel ein, ob du auf dem Startfeld stehst. Wenn nein, fahre, wenn ja, drehe 2x links. Wie im Beispiel halt.
Das ist ja das Problem haha
Das Startfeld muss ja irgendwie ermittelt werden. Z.B. über eine Variable, welche die Anzahl des ausgeführten Fahren zähl, hätte ich jetzt gedacht
Mit einer Variable wäre das ja recht easy, da kannst du ja einfach einen Int hoch-/runterzählen, je nach Richtung
jo, das ding ist, bei der Rekursiv wird dieser konstant wieder auf den initialisierten Wert zurückgesetzt, da diese sich ja rekursiv aufruft.
LG
Darfst du Variablen außerhalb der Methoden erstellen? Da wird dann ja nichts zurückgesetzt
Hi, so einfach ist es nicht, mein Fehler, tut mir leid.
Er soll auf das Startfeld zurück fahren. Wenn man ein weiteres zurWand(); einbaut, dann fährt dieser bis zur Wand. Er kann aber von jedem beliebigen Startpunkt im Raum starten.