Peter: Redundante Schleife

Hallo!

Wie kann ich (durch einen "kniff") heraus bekommen in welcher tiefe ich mich in einer redundanten Schleife befinde?

Ich habe schon versucht eine "$pass"-Variable zu übergeben die immer hochgezählt wird, allerdings ist entweder was schief gelaufen oder das geht so nicht.

Bestes Beispiel für diesen Vorgang ist dieses Forum.
Ich möchte einen Stammbaum darstellen und dazu müsste ich wissen in der wievileten ebene sich die Schleife befindet. Wenn die Schleife also zum ersten mal Rekursiv ausgeführt wird soll ne $pass = 1 sein. wenn Sie zum 5. mal aufgerufen wird soll $pass = 5 sein, uws...

Also

0 Main

  • 1 sub
    0 Other Main
  • 1 Other sub
  • 1 Other sub
    • 2 subsub
    • 2 subsub
      • 3 subsubsub
  • 1 sub
    0 Other Main

Wie erreiche ich das?

Danke
Peter.

  1. Wie kann ich (durch einen "kniff") heraus bekommen in welcher tiefe ich mich in einer redundanten Schleife befinde?

    Du meinst Rekursion.

    Bestes Beispiel für diesen Vorgang ist dieses Forum.
    Ich möchte einen Stammbaum darstellen und dazu müsste ich wissen in der wievileten ebene sich die Schleife befindet.

    Warum?

  2. Hi Peter!

    Wie erreiche ich das?

    Mit einer statischen Variable, die du vor dem rekursiven Aufruf hoch- und gleich danach wieder runterzählst.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Mahlzeit Hopsel,

      Wie erreiche ich das?
      Mit einer statischen Variable, die du vor dem rekursiven Aufruf hoch- und gleich danach wieder runterzählst.

      Oder alternativ mit einer statischen Variable, die quasi als erste Anweisung innerhalb der rekursiv aufgerufenen Funktion hoch- und als letzte Anweisung wieder heruntergezählt wird.

      Vorteil: man muss beim initialen Aufruf nicht vorher die Variable setzen bzw. hochzählen.

      MfG,
      EKKi

      --
      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      1. Hallo!

        Danke ich habs!! Natürlich meinte ich Rekursiv.. Oh mann ^^ Danke!

        Peter

        1. Danke ich habs!! Natürlich meinte ich Rekursiv.. Oh mann ^^ Danke!

          Mich interessiert immer noch, warum du einen Zähler brauchst :)

          Um in einer bestimmten Tiefe abzubrechen? Da ist das sinnvoll.
          Um den einzelnen Ebenen Klassen zu verpassen 'class="level_4"'? Da ist das ganze höchst unsinnig.

          1. Hello,

            Um den einzelnen Ebenen Klassen zu verpassen 'class="level_4"'? Da ist das ganze höchst unsinnig.

            Nö, wenn es zum Beispiel um automatische Einrückung, z.B. bei Listen, geht, dann kann das sogar sehr sinnvoll sein.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Nö, wenn es zum Beispiel um automatische Einrückung, z.B. bei Listen, geht, dann kann das sogar sehr sinnvoll sein.

              Bei einer XML-Liste wo die Tiefe ohnehin durch die Struktur gegeben ist?

              Ob das nun HTML ist oder ein Word-Dokument, es besteht keine Notwendigkeit das für diesen Zweck zu kennzeichnen.

            2. @@Tom:

              nuqneH

              Um den einzelnen Ebenen Klassen zu verpassen 'class="level_4"'? Da ist das ganze höchst unsinnig.

              Nö, wenn es zum Beispiel um automatische Einrückung, z.B. bei Listen, geht, dann kann das sogar sehr sinnvoll sein.

              Nö. Wozu sollte das sinnvoll sein?

              Nachfahren- und Kindselektor kennst du?

              Qapla'

              --
              Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
              (Mark Twain)
            3. Hello,

              Um den einzelnen Ebenen Klassen zu verpassen 'class="level_4"'? Da ist das ganze höchst unsinnig.

              Nö, wenn es zum Beispiel um automatische Einrückung, z.B. bei Listen, geht, dann kann das sogar sehr sinnvoll sein.

              Wer spricht hier von XML oder HTML? Ich habe schließlich in einem Thread der Kategorie PHP geantwortet.

              Und wenn man für die Datenstrukturierung die Hierarchiestufe benötigt, dann kann das eben sehr sinnvoll sein, sie auch zu kennen.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Hello,

                ?

                Ich habe doch auf Gunnar geantwortet und nicht auf mich.
                Naja, der Fehler passt zufällig prima zum Thema...

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
              2. Wer spricht hier von XML oder HTML? Ich habe schließlich in einem Thread der Kategorie PHP geantwortet.

                Der Op, indirekt:

                Bestes Beispiel für diesen Vorgang ist dieses Forum.

                Das Forum erzeugt XHTML 1.0 Strict.

      2. Hi EKKi!

        Wie erreiche ich das?
        Mit einer statischen Variable, die du vor dem rekursiven Aufruf hoch- und gleich danach wieder runterzählst.
        Oder alternativ mit einer statischen Variable, die quasi als erste Anweisung innerhalb der rekursiv aufgerufenen Funktion hoch- und als letzte Anweisung wieder heruntergezählt wird.

        Vorteil: man muss beim initialen Aufruf nicht vorher die Variable setzen bzw. hochzählen.

        Ob du die statische Variable innen oder außen de-/inkrementierst hat für mich weder Vor- noch Nachteile.
        Und was du mit "initialem Aufruf" meinst, ist mir auch nicht ganz klar. Beim Aufruf einer rekursiven Funktion aus dem Programmcode heraus setzt du ja die statische Variable nicht. Das passiert erst innerhalb der Funktion.

        Mal sehen, ob ich dich richtig verstehe.
        Mein Vorschlag:

        function r()  
        {  
          static $var = 0;  
          
          echo $var;  
          
          if($var < 9)  
          {  
            $var++;  
            r();  
            $var--;  
          }  
        }
        

        Dein Vorschlag:

        function r()  
        {  
          static $var = -1;  
          $var++;  
          
          echo $var;  
          
          if($var < 9)  
            r();  
          
          $var--;  
        }
        

        Da finde ich "meine" Variante bzgl. der Aufgabenstellung "Gib die Zahlen von 0 bis 9 aus" schon leichter verständlich.

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
      3. Hello,

        Mit einer statischen Variable, die du vor dem rekursiven Aufruf hoch- und gleich danach wieder runterzählst.

        1. Rekursion ist keine Schleife. Entweder Rekursion, oder Schleife...

        2. Ich hätte für die Tiefenmessung ein Funktionsargument verwendet, das innerhalb der Funktion
           als erstes incrementiert wird. Erst dann wird bei Bedarf die nächste Schachtelung aufgerufen
           und das Argument übergeben.

        Decrementieren muss bzw. darf man gar nicht. Der Wert vor dem Aufruf wird ja auf dem Stack
           abgelegt und steht daher beim Rücksprung wieder zur Verfügung.

        3. einen Zeiger auf eine externe statische Variable muss man nur dann übergeben, wenn andere
           nebenläufige Prozesse ebenfalls wissen sollen, in welcher Tiefe sich die Rekursion
           gerade befindet. Dann muss aber die Rekurionsfunktion auch threadsicher geschrieben
           werden!

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  3. Wie kann ich (durch einen "kniff") heraus bekommen in welcher tiefe ich mich in einer redundanten Schleife befinde?

    Redundant ist etwas, was mehrfach vorhanden ist; dein Wasserwerk ist beispielsweise höchstwahrscheinlich redundant stromversorgt, weil es an zwei unabhängige Trafostationen angeschlossen ist und obendrein vielleicht auch noch ein Notstromaggregat hat.

    Was du meinst ist Rekursion, sich selbst aufrufend.

    Ich habe schon versucht eine "$pass"-Variable zu übergeben die immer hochgezählt wird, allerdings ist entweder was schief gelaufen oder das geht so nicht.

    Wenn etwas nicht so will, wie es soll, ist es beim Fragen dazu fast immer unverzichtbar, den nicht funktionierenden Code mitzuliefern. Wie soll hier jemand deinen Fehler aufzeigen, wenn du den fehlerhaften Code nicht zeigst?

    Grundsätzlich geht's so:

    function bla($durchlauf) {
      echo $durchlauf . "\n";
      if ($durchlauf < 10) {
         bla($durchlauf + 1);
      }
    }