2017-02-10 22 views
0

Ich habe eine Frage in Bezug auf eine rekursive Funktion, die ich gemacht habe. Gibt es eine Möglichkeit, eine Funktion vollständig zu beenden, sobald ich die Zeile "return arraydenodes" erreiche? Da ich die Code-Ausführung mit Visual Studio befolgt habe und die Ausführung erst einmal zu der oben erwähnten Zeile kommt, kehrt sie zu dem Stack (oder glaube ich) direkt in das "else" von der while-Schleife zurück. Und deshalb laufen die path.Add Zeilen weiter und geben mir ein anderes Ergebnis. Hier ist der Code.Beenden Sie vollständig von einer rekursiven Funktion

private Node[] checkTheOtherDude(Node start, Node endpadre, Node end, Node previousNodeTemp) 
{ 

    //Debug.Log(previousNode); 
    while(endpadre != null && !stop) 
    { 

     if (!Physics.Linecast(end.transform.position, endpadre.transform.position)) // end y endpadre se ven? 
     { 
      previousNode = endpadre; 
      Node newParent = endpadre.padre; 

      checkTheOtherDude(start, newParent, end, previousNode); // chequear n y n padre padre 

     } 
     else 
     { 
      //previousNode = endpadre; 
      path.Add(end); 
      path.Add(previousNode); 
      end = endpadre; 
      Node newParent = end.padre; 
      checkTheOtherDude(start, newParent, endpadre, previousNode); 
     } 
    }  
     stop = true; 
     path.Add(end); 
     path.Add(start); 
     path.Reverse(); 
     arraydeNodes = path.ToArray(); 
     return arraydeNodes;     
} 

Es scheint, dass ich das Problem gelöst haben, das Problem (oder zumindest glaube ich) war es die während Zustand änderte es zu while (endpadre != null && !stop && endpadre != start) ich die endpadre != start fehlte, so dass die Schleife rechts enden würde, wenn das Ende Der Knoten war derselbe wie der Startknoten.

+3

Wenn Sie es richtig entwerfen, sollte es keine Rolle spielen. Wenn Sie in Schwierigkeiten geraten, macht Ihre rekursive Methode zu viel (Trennung von Bedenken) oder ist nicht richtig strukturiert. Wenn der innerste Aufruf beendet wird, sollte er natürlich den ganzen Stapel zurückkommen, d. H. Innerhalb der richtigen Rückgabestruktur des Verfahrens. –

+1

Wenn Sie am Ende der Methode einen Rekursionsexit haben, werden Sie erst beendet, wenn jeder rekursive Aufruf den Exitpunkt erreicht. Was bedeutet, alles zu durchlaufen. Stellen Sie sich vor, die exit-Bedingung an den Anfang der rekursiven Methode zu setzen –

+0

Da ich nicht genau weiß, was die Funktion tun soll, könnte dies für diesen speziellen Fall falsch sein, aber im Allgemeinen möchten Sie die Ergebnisse rekursiver Aufrufe zurückgeben. – code11

Antwort

0

Ist es in Ordnung, dass Code, der nach der while-Schleife geht, wird mehrfach ausgeführt werden (so viele wie Ihre Rekursionsstufe)?
Auch path.Reverse() wird mehrmals aufgerufen werden, was ich nicht sicher bin, dass Sie wirklich wollen.

Um diesen Code aus ausgeführt wird, zu verhindern, dass Sie etwas tun können:

if (!stop) 
{ 
    stop = true; 
    path.Add(end); 
    path.Add(start); 
    path.Reverse(); 
    arraydeNodes = path.ToArray(); 
} 

return arraydeNodes;  

Ich habe mit ihm ein wenig gespielt, und ich habe den Code geändert.
Versuchen Sie folgendes:

private Node[] checkTheOtherDude(Node start, Node endpadre, Node end, Node previousNodeTemp) 
{ 
    if (endpadre == null) 
    { 
     path.Add(end); 
     path.Add(start); 
     path.Reverse(); 
     arraydeNodes = path.ToArray(); 
     return arraydeNodes; 
    } 
    else if (!Physics.Linecast(end.transform.position, endpadre.transform.position)) // end y endpadre se ven? 
    { 
     previousNode = endpadre; 
     Node newParent = endpadre.padre; 

     return checkTheOtherDude(start, newParent, end, previousNode); // chequear n y n padre padre 

    } 
    else 
    { 
     //previousNode = endpadre; 
     path.Add(end); 
     path.Add(previousNode); 
     end = endpadre; 
     Node newParent = end.padre; 
     return checkTheOtherDude(start, newParent, endpadre, previousNode); 
    }     
} 

Versuchen Sie, diese mit Testdaten zu laufen (nur wenige Knoten). Dann prüfe den Pfad nach dem ersten Klick und debugge den zweiten Klick. Sie sollten den Problempunkt sehen können. Vielleicht gibt es unendliche Rekursion (Zyklus in Knoten Klammern)

+0

Jedes Mal, wenn ich klicke, wird der Code ausgeführt und ein Pfad generiert. Der erste Klick funktioniert gut, der zweite Klick (während desselben Programmlaufs) löst einen Stapelüberlauffehler aus. –

+0

Überprüfen Sie meinen geänderten Antwortcode – tomassino

+0

immer noch das gleiche, ich bin der Meinung, dass das Problem von einem anderen Ort im Code kommen kann, obwohl der Fehler in diesen Zeilen sagt. –

0

Ja gerade diese zwei Linien

ändern
checkTheOtherDude(start, newParent, end, previousNode); 
checkTheOtherDude(start, newParent, endpadre, previousNode); 

zu

return checkTheOtherDude(start, newParent, end, previousNode); 
return checkTheOtherDude(start, newParent, endpadre, previousNode); 

diese wird es den ganzen Weg machen zurückkehren up

+0

Jedes Mal, wenn ich klicke, wird der Code ausgeführt und ein Pfad generiert. Der erste Klick funktioniert gut, der zweite Klick (während desselben Programmlaufs) löst einen Stapelüberlauffehler aus. –

+0

@JackBauer Sie sollten nicht haben Ihre rekursive Methoden Nebenwirkungen verursachen. Das ist dein Hauptproblem hier. Ihre rekursiven Methoden sollten einen Wert berechnen und zurückgeben, indem sie alle Daten, die sie als Parameter benötigen, übernehmen und all ihre Berechnungen als Rückgabewert zurückgeben. Muting-Zustand in dem Prozess erstellt eine riesige Sauerei, wie Sie sehen. – Servy

Verwandte Themen