Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Arvon palautus rekursiivisesta funktiosta

Sivun loppuun

odys [09.10.2006 17:18:25]

#

Minulla on eräs funktio, joka käsittelee erilaisia numerosarjoja; Kutsun sitä aina rekursiivisesti funktion lopussa kunnes numerosarja on ratkennut, mutta kun yritän lopulta palauttaa numerosarjaa taulukossa, se ei pidä sisällään mitään.. Tässä ongelman ydin:

<?php

function rekursio($table, $map) {
    .
    .
    Tehdään kaikkea jännää $mapille
    .
    .
    if(onko_valmis($map)) { // Jos on valmis tehdään näin
        return $map; // Palauttaa tyhjän, mutta jos laitan ennen return komentoa print_r($map); tulee valtava määrä valmiiksi käsiteltyä tietoa ihan oikein, mutta returnin yhteydessä kaikki tuntuu katoavan kuin tuhka tuuleen
    } else {
        rekursio($table, $map);
    }
}

?>

Eli siis mikä mättää?

Merri [09.10.2006 17:54:14]

#

Väsyneen pään logiikalla näin:

. . .

    } else {
        $map = rekursio($table, $map);
    }

. . .

Muoks!
Tai ehkä ei sittenkään. En kylläkään muista, pystyikö PHP:ssa määrittelemään jotenkin voiko funktiolle syötetyn muuttujan tyyppiä vaihtamaan, siis että tehdäänkö siitä kopio (by value) vai onko muuttuja kopioimaton (by reference).

odys [09.10.2006 17:56:40]

#

Olen koittanut tota jo.. ei auta :(

Merri [09.10.2006 17:58:55]

#

Hmm, olisiko sitten jotakin niin perverssiä kuin return rekursio($table, $map); ...

Tämä on tätä kun pitäisi miettiä alusta asti tuo mitä tuossa tapahtuu missä järjestyksessä ja missä vaiheessa logiikka ei enää pelaakaan.

odys [09.10.2006 18:04:32]

#

Aivan =) oon miettinyt pään puhki, mutta se kummastuttaa, että jos tulostan taulukon näin:
print_r($map); // tulee oikeat tiedot juuri niinkuin haluan
return $map; // tiedot ovat kadonneet ??!?!??! miten on mahdollista

tsuriga [09.10.2006 18:19:15]

#

<?php

function rekursio($table, $map) {
    $arr = array();

    if (ehto)
        $arr = array_merge($arr, rekursio(parametri1, parametri2));

    return $arr;
    }
}

?>

Ja parametri1 & parametri2 eivät voi olla samat kuin $table ja $map, koska muuten rekursio pyörii ikuisesti ellet sitten käytä jotain globaalia muuttujaa ja käytä sitä ehtolauseessa.

Antti Laaksonen [09.10.2006 18:48:32]

#

Jos muuttujassa $map on oikeat tiedot ennen return-lausetta, niin kyllä funktiokin palauttaa oikeat tiedot.

Voisitko vähän tarkemmin kertoa, mitä rekursiivisen funktion on tarkoitus tehdä?

odys [09.10.2006 19:02:57]

#

Ei kyllä lähe toimimaan tollakaan :<
En vaan keksi mikä tossa on.. kaikki avunannot otetaan avosylin vastaan =)

tsuriga [09.10.2006 19:12:15]

#

Mikä on tuon muuttujan $onko_valmis määritelmä? Millä ehdolla rekursiivista funktiota kutsutaan uudelleen?

Antti Laaksonen [09.10.2006 19:29:44]

#

Varma (mutta työläs) tapa selvittää ongelma on lisätä funktioon echo-lauseita, joista voi seurata ohjelman kulkua ja muuttujien arvoja. Kun on riittävän kärsivällinen, niin vika kyllä paljastuu ohjelman tulostusta tutkimalla. Virheen etsiminen helpottuu, jos funktioon lisää muuttujan $kerros, joka ilmoittaa, kuinka mones sisäkkäinen funktion kutsu on kyseessä.

odys [09.10.2006 19:50:27]

#

Olen kokeillut ja testannut funktion toimivaksi juuri echoja käyttämällä sekä kerroksia tutkimalla, kaikki pelaa funktiossa niinkuin pitää, ei mitään moitteita, mutta jonnekkin se tieto katoaa kun returnaa.. funktion sisällä tiedon tulostaminen onnistuu vallan mainiosti, mutta kun yrittää returnilla laittaa tietoa eteenpäin niin se vain katoaa :S


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta