Andreas Dölling: Rekusrion läuft nicht

hallo,
ich habe eine klasse _Node, welche eine baumstruktur abbildet (ganz ähnlich der DOM-node-klasse).
in dieser klasse gibt es eine methode getAllNodes(), welche eine flache liste aller _Node-objekte unterhalb des angesprochenen objekts liefert:

// returns an array containing all nodes contained in the _Node-object
_Node.prototype.getAllNodes = function () {
 var allChildren=new Array();
 allChildren=this.childNodes;

for (i=0; i<this.childNodes.length; i++) {
  if(this.childNodes[i].childNodes.length>0) {
   allChildren=allChildren.concat(this.childNodes[i].getAllNodes());
  }
 }
 return allChildren;
}

diese rekursive funktion läuft aber nicht bzw. endet in einer endlosschleife. einen logischen fehler kann ich aber nicht entdecken.
könnt ihr mir auf die sprünge helfen?

thanx und ciao,
andreas

  1. hi

    // returns an array containing all nodes contained in the _Node-object
    _Node.prototype.getAllNodes = function () {
    var allChildren=new Array();
    allChildren=this.childNodes;

    for (i=0; i<this.childNodes.length; i++) {

    Ich bin mir nicht sicher, mein java ist etwas gerostet,
     aber du setzt in der For schleife
    i immer =0 wie soll das ding jemals fertig werden?

    versuchs mal mit ner while schleife

    Sonia

    1. Ich bin mir nicht sicher, mein java ist etwas gerostet,
      aber du setzt in der For schleife
      i immer =0 wie soll das ding jemals fertig werden?

      Ja, das scheint wirklich eingerostet zu sein... :o)
      Der erste Wert (also i = 0) setzt lediglich den Wert. Wichtig für den internen Counter ist die dritte Position also das i++.

      Gruss,
      CS

      1. Ja, das scheint wirklich eingerostet zu sein... :o)
        Der erste Wert (also i = 0) setzt lediglich den Wert. Wichtig für den internen Counter ist die dritte Position also das i++.

        *g*
        Ok, ich wussts nicht mehr genau.

        :-))

    2. aber du setzt in der For schleife
      i immer =0 wie soll das ding jemals fertig werden?

      versuchs mal mit ner while schleife

      Sonia

      danke für die schnelle antwort.
      ja, an das i in der for-schleife hatte ich auch schon gedacht. andererseits gehe ich aber davon aus, daß das i sich nur auf den namensraum innerhlab der for-schleife bezieht.
      und die rekursion ruft doch eigentlich nicht dieselbe funktion auf, sondern die methode getAllNodes() des jeweiligen kind-knotens:
      allChildren=allChildren.concat(this.childNodes[i].getAllNodes());

      ich bin davon ausgegangen, daß ein konflikt mit der lokalen zählvariable  gar nicht entstehen kann.
      der geschieht, wenn die rekursion auf kin-knoten trifft, die ihrerseits keine weiteren kinder haben.

      hm, denkfehler bei mir?

      andreas

      1. Ok, dann stimmt entweder was mit deinem Abbruchkriterium nicht
        oder an irgendeiner anderen stelle die hier nicht sichtbar ist
        hast du einen Fehler

        was anderes kann ich mir nicht vorstellen

        hast du dir den Wert von deinem Abbruchkriterium mal ausgeben lassen?

  2. Hi,

    was mir auf den ersten Blick auffällt:

    for (i=0; i<this.childNodes.length; i++) {

    ^
    Du legst durch Weglassen von "var" ein _globale_ Variable i an, was Dir bei Rekursionen natürlich Probleme macht.
    Probiere einmal:
    for (var i=0; i<this.childNodes.length; i++) {

    Logikfehler habe ich jetzt nicht gesucht ... ;-))

    Viele Grüße,
    Martin

  3. oh mann,
    sorry, wenn ihr euch nun den kopf zerbrochen habt. der fehler liegt NICHT in der geposteten methode. die rekursion läuft einwandfrei.

    damit ihr ruhig schlafen könnt ;) - hier die fehlerquelle:

    ich hatte die methode von einer anderen klasse aus aufgerufen:
    // expects a Topic-object and transfers its structure to DOM-nodes, so that the Topic can be displayed as a tree
    Treeview.prototype.importTree = function(baseItem) {
     for (i=0; i<baseItem.getAllNodes.length; i++) {
      this.appendItem (baseItem.getAllNodes[i]);
     }
    }

    es muß natürlich heißen getAllNodesi !!!!!
    MIT klammern!!!

    die einfachsten fehler findet man halt immer am schwersten...

    trotzdem danke!
    andreas

    1. Hi,

      und Du bekommst keine Probleme mit der _globalen_ Gültigkeit des Schleifenzählers i? Dieser müsste ja eigentlich die Gesamtzahl _aller_ Kinder des Baumes repräsentieren.

      Viele Grüße,
      Martin

      1. daher bitte Nachsicht mit meinem vorherigen (und dem "anderen") Posting üben...

        Martin Jung

        1. daher bitte Nachsicht mit meinem vorherigen (und dem "anderen") Posting üben...

          Martin Jung

          nein - du hattest völlig recht!
          es muß heißen:
          for (var i=0; i<this.childNodes.length; i++) {

          das war tatsächlich noch ein fehler in der von mir geposteten methode.
          ohne das "var" läuft das skript in eine endlosschleife.
          (habe es soeben mal ausprobiert.)

          die rekursion an sich ist völlig in ordnung.

          thanx und ciao,
          andreas

          1. Hi,

            nein - du hattest völlig recht!

            ich weiß ....

            Ich habe heute aber zu häufig den geistigen Kontext wechseln müssen. Da geht dann irgendwann die Orientierung verloren..

            Egal, Dein Problem ist gelöst und das war ja Ziel der Übung.

            Viele Grüße,
            Martin