Entwickler-Ecke

Programmiersprachen (Server) - Funktionsergebnisse während eines rekursiven Durchlaufs


Pepp3r - Do 04.04.13 13:43
Titel: Funktionsergebnisse während eines rekursiven Durchlaufs
Hallo liebe Entwickler-Community,
ich stehe vor folgendem Problem:
Es gibt eine rekursive Funktion "traverse", die eine Baumstruktur durchläuft.
Die Funktion gibt den jeweiligen Knoten zurück.
Gibt es eine Möglichkeit jene Knoten ab zu fangen ohne sie in beispielsweise einem array zwischen zu speichern?
Lg
Jones


jfheins - Do 04.04.13 13:57

Was verstehtst du denn unter abfangen?

Statt die Knoten in einem Array zu speichern kannst du sie auch direkt in der Konsole ausgeben, in nem Memo ausgeben, per showmessage/Messagebox ausgeben, Breakpoint mahcn und angucken, etc.


Pepp3r - Do 04.04.13 14:13

Abfangen bedeutet, dass ich _eine_ Funktion "traversieren" habe, dessen return-Wert ein Knotenobjekt ist, den ich je nach Zweck weiterverarbeiten kannt.
Ein Knoten hat mehrere Instanzvariablen.
In einem Fall brauche ich die ID im anderen Fall den Wert. Ich brauche also die Funktion "traversieren", die ich im Einzelfall einfach erweitere.
Die Funktion soll etwa so funktionieren (Pseudo):

PHP-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function echoValue($node){
  echo function traverse($node)->getValue(){ //hier bekomme ich lediglich das Ergebnis des letzten Durchlaufs
         return $node;
         for ($index=0$index<=count($node->getChildren); $index++){
           $this->traverse($node->getChild($index));
         }
       }
}


Christian S. - Do 04.04.13 14:27

Wenn ich Dich richtig verstanden habe, brauchst Du eine Callback-Funktion, welche du traversieren übergibst und welche dann in jedem Durchlauf aufgerufen wird.


Damit wird in jedem Schleifendurchlauf die Callback-Funktion aufgerufen. Die habe ich hier als anonyme Funktion gemacht, Du kannst aber auch eine "normale" Funktion übergeben.

PHP-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function Iterate($max$callback) {
  for($i = 0$i < $max$i++)
    $callback($i);
}


//Aufruf:
Iterate(10function($value) {
  echo $value;
});


Pepp3r - Do 04.04.13 15:14

Wunderbar, genau das habe ich gesucht!
Vielen Dank! :)