Ankündigung

Einklappen
Keine Ankündigung bisher.

Verständnisfrage Rekursive Funktion

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Verständnisfrage Rekursive Funktion

    Hallo,

    bin wie ich immer sage, fortgeschrittener Anfänger. Dennoch fehlt es bei mir bei manchen Grundlagen am Verständnis.
    Hier ein Beispiel:

    Rekursive Funktionen

    PHP-Code:
    function addieren($n) {
                    if(
    $n 1) {
                        return;
                    }
                 echo 
    $n "<br>";
                 
    addieren($n 1);  
                  }
    addieren(5); 
    In diesem Beispiel bekomme ich als Ausgabe 5,4,3,2,1
    Stelle ich aber leicht um
    PHP-Code:
     function addieren($n) {
                    if(
    $n 1) {
                        return;
                    }
                 
    addieren($n 1);  
                 echo 
    $n "<br>";
                }

         
    addieren(5); 
    bekomme ich 1,2,3,4,5 als Ausgabe.
    Macht es so einen Unterschied im Funktionsrumpf, wenn die Position der echo-Anweisung vor oder nach dem erneuten Aufruf der Funktion aufgerufen wird?

  • #2
    Macht es so einen Unterschied im Funktionsrumpf, wenn die Position der echo-Anweisung vor oder nach dem erneuten Aufruf der Funktion aufgerufen wird?
    Offensichtlich. Und logisch ist es auch noch.

    und wieder einmal ein Beispiel, warum man in einer Funktion kein echo nehmen, sondern die Werte zurückgeben soll ...

    Kommentar


    • #3
      Hmm,
      nee logisch ist es nicht wirklich für mich.

      Hätte beim unteren Code jetzt vermutet, das 4,3,2,1 ausgegeben wird.
      addieren($n-1) => $n = 4 (5 - 1) beim ersten Durchlauf.
      Wieso 1,2,3,4,5 ?
      Kapier ich jetzt nicht wirklich.
      echo zeigt aber hier in diesen Beispielen den Verlauf von $n ersichtlich an.

      Kommentar


      • #4
        Kapier ich jetzt nicht wirklich.
        Geh doch mal manuell jeden Schritt (jedes aufgerufene PHP-Statement) durch -- inklusive Rekursion -- den PHP macht.

        Kommentar


        • #5
          Am besten mal xdebug installieren, Breakpoint setzen und dann mal schauen was dein Code wirklich macht.
          [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

          Kommentar


          • #6
            Wenn du eine Funktion aufrufst, dann wird der nachfolgende Code erst ausgeführt, nach dem die Funktion beendet wurden. Das ist bei einer rekusiven Funktion genauso. Bis zum erreichen des Abbruchkriteriums (hier $n < 1) sind sämtliche Funktionsaufrufe noch nicht beendet, erst an dem Punkt beenden sich die Aufrufe in umgedrehter Reihnfolge. Setz mal das echo oben und unten hin. Dann wird es vielleicht klarer.

            Das Ergebnis sieht dann so aus: 5 4 3 2 1 1 2 3 4 5

            Kommentar


            • #7
              Anbei, gute Namen sind für das allgemeine Verständnis doch essentiell. Ich verstehe nicht warum die Funktion "addieren" jedes mal 1 abzieht.
              Reduziert auf 2 Durchläufe ($n = 2 zu Beginn), der Einfachheit wegen, passiert folgendes im unteren Code:
              Code:
              - addieren(2)
                  - 2 < 1 -> false
                  - addieren(1)
                      - 1 < 1 -> false
                      - addieren(0)
                          - 0 < 1 -> true -> return
                      - echo 1
                  - echo 2

              Kommentar


              • #8
                Evtl. hilft diese Lektüre weiter https://de.wikipedia.org/wiki/Rekursion

                Dein Code macht folgendes (beachte dass er beim oberen 5 x nichts erledigt, aber aus der Funktion zurückspringt):

                Code:
                function addieren($n) {                        
                                if($n < 1) {                        
                                    return;                        
                                }                        
                             echo $n . "<br>";                        
                             addieren($n - 1);                          
                              }                        
                addieren(5);                        
                
                
                addieren(5)                        
                    echo 5                    
                    addieren(5-1)                    
                        echo 4                
                        addieren(4-1)                
                            echo 3            
                            addieren(3-1)            
                                echo 2        
                                addieren (2-1)        
                                    echo 1    
                                    addieren(1-1)    
                                        return
                                    tu nix
                                tu nix                    
                            tu nix                    
                        tu nix                    
                    tu nix                    
                
                 function addieren($n) {                        
                                if($n < 1) {                        
                                    return;                        
                                }                        
                             addieren($n - 1);                          
                             echo $n . "<br>";                        
                            }                        
                
                     addieren(5);                          
                
                addieren(5)                        
                    addieren(5-1)                    
                        addieren(4-1)                
                            addieren(3-1)            
                                addieren (2-1)        
                                    addieren(1-1)    
                                        return
                                    echo 1        
                                echo 2            
                            echo 3                
                        echo 4                    
                    echo 5

                Kommentar

                Lädt...
                X