rückgabe aus rekursiver funktion

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

  • rückgabe aus rekursiver funktion

    hallo,

    mich ärgert grad diese kleine funktion:
    PHP-Code:
    function listWeight($sum=0$list=NULL$num=15)
    {
        if(
    is_null($list))
            
    $list = array();

        if(
    $sum == $num)
        {
    //testausgabe -----------------
            
    echo 'x';
            
    print_r($list);
            echo 
    'x';
    //----------------------------------
            
    return $list;
        }

        
    $anz rand(03);
        if(
    $anz 0)
        {
            if(
    $anz $sum $num)
            {
                 
    $list[] = listWeight($sum$list);
            }
            else
            {
                 
    $list[] = $anz;
                 
    $sum += $anz;
                 
    listWeight($sum$list);
            }
        }
        else
        {
            
    listWeight($sum$list);
        }
    }

    $out listWeight();
    print_r($out); 
    drolligerweise erhalte ich innerhalb der fkt die werte wie erwartet ausgegeben ... nach dem return sind sie futsch.

    jemand eine idee, wo es hängt?
    thx
    wurzel
    Kissolino.com

  • #2
    Mal ne Frage, wieso rufst du listWeight auf, ohne den Rückgabewert einer var zuzuweisen ?


    An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

    Kommentar


    • #3
      si, der wert wird ja in den funktions-parametern übergeben. tut ja auch ... nur eben nicht returnen *grml*.

      eine wertzuweisung ändert übrigens nichts.
      Kissolino.com

      Kommentar


      • #4
        ich bin mir nicht sicher ob es hilft, aber ich hatte ähnliche Problem bis ich die return-Anweisung in die letzte Zeile der Funktion geschoben hatte - danach gings dann ...

        Kommentar


        • #5
          die funktion liefert nix zurück, is ja seltsam.

          egalw a sman macht, es kommt nix raus.

          return 'test'; z.B. liefert auch nix...

          mal weiter testen


          An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

          Kommentar


          • #6
            @patrick ... so gehts
            PHP-Code:
            function listWeight($sum=0$list=NULL$num=15)
            {
                if(
            is_null($list))
                    
            $list = array();

                if(
            $sum != $num)
                {
                    
            $anz rand(03);
                    if(
            $anz 0)
                    {
                         if(
            $anz $sum $num)
                         {
                              
            $list=listWeight($sum$list);
                         }
                         else
                         {
                             
            $list[] = $anz;
                             
            $sum += $anz;
                             
            $list=listWeight($sum$list);
                         }
                    }
                    else
                    {
                         
            $list=listWeight($sum$list);
                    }
                }
                return 
            $list;
            }

            $out listWeight();
            print_r($out); 
            ... aber warum?
            Kissolino.com

            Kommentar


            • #7
              Original geschrieben von Wurzel
              ... aber warum?
              Du darfst alles essen aber nicht alles wissen
              h.a.n.d.
              Schmalle

              http://impressed.by
              http://blog.schmalenberger.it



              Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
              ... nur ohne :-)

              Kommentar


              • #8
                mich würde es auch brennend interressieren

                hab in denusernotes auf php.net aber bis jetzts hilfreiches zu diesem thema gefunden


                An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

                Kommentar


                • #9
                  Original geschrieben von schmalle
                  Du darfst alles essen aber nicht alles wissen
                  lass du mal besser die finger von den bunten pillen ... wetten, du weisst das auch nicht
                  Kissolino.com

                  Kommentar


                  • #10
                    mir ist es bei einer Migration von php4 nach php5 über den Weg gelaufen - ich wollte auch wissen wieso und habe nix gefunden ... wenn einer von euch noch die ultimative Erleuchtung erfährt bitte hier posten

                    - Danke.

                    Kommentar


                    • #11
                      Original geschrieben von Wurzel
                      wetten, du weisst das auch nicht
                      *pfeifender weise das weite sucht*
                      h.a.n.d.
                      Schmalle

                      http://impressed.by
                      http://blog.schmalenberger.it



                      Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
                      ... nur ohne :-)

                      Kommentar


                      • #12
                        hmm,

                        es liegt an der recursion.

                        wenn die abbruchbedingung erfüllt ist, läßt du deinen wert zurückgeben - schön. nur eine instanz tiefer? da versickert er im nirgendwo.

                        entweder, ihr steht alle auf der leitung, oder ich ...

                        Wurzel hat es doch entsprechend abgeändert, fragt dann aber
                        ... aber warum?
                        obwohl es doch an den änderungen eindeutig abzulesen ist ...

                        da im original des einzige return in dem (in den ersten rec-level niemals erfüllten) if-bereich steht, wird halt nix zurückgegeben!?

                        oder wie? oder was?
                        Die Zeit hat ihre Kinder längst gefressen

                        Kommentar


                        • #13
                          Ich sehe das so:

                          anhand der Bedingung in If und die Funktionsparameter sieht man, dass sobald die Bedingung wahr ist werden alle return im Stack aufgerufen, im Klartext es werden return(n),return(n-1),....return(0) aufgerufen, ohne daß der untere Anweisungsblock angerührt wird. So betrachten wir nunmal den allerersten rekursiven Aufruf:

                          - Fkt. wird vom main auf gerufen
                          - Bedingung trifft nicht zu
                          - return(1) wird in Stack abgelegt
                          - Fkt. ruft sich selbst auf

                          -> da in diesem Moment $sum==0 und $anz<=3 ist, wird die Fkt. sich nicht über: $list[] = listWeight($sum, $list); aufgerufen, sondern über: listWeight($sum, $list);, d.h. wenn return(1) nachher vom Stack aktiviert wird, wird das Ergebnis(Returnwert) ins Nichts reingeschrieben.

                          Kommentar


                          • #14
                            @asp
                            versteh ich nicht ...
                            PHP-Code:
                            if($sum == $num)
                                {
                            //testausgabe -----------------
                                    
                            echo 'x';
                                    
                            print_r($list);
                                    echo 
                            'x';
                            //----------------------------------
                                    
                            return $list;
                                } 
                            ^^ aus dem ersten code geschnippt. das print_r() liefert eine ausgabe von $list - d.h. ich sehe die werte, die ich eigentlich ausserhalb der fkt. auch erwarte - exakt diese variable bzw. deren inhalt gibt return zurück und bricht die abarbeitung der fkt. ab ... so war es gedacht. warum es das aber nicht tut (also die rückgabe) darfst du mir nochmal erklären, als wär ich 3 jahre alt
                            Kissolino.com

                            Kommentar


                            • #15
                              weil,

                              du zwar aus der letzten, abgebrochenen ebene zurückgibst, aber nur in die vorherige! und was passiert dort? nischt.
                              Die Zeit hat ihre Kinder längst gefressen

                              Kommentar

                              Lädt...
                              X