Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Objasnjenje rekurzivne funkcije

[es] :: PHP :: Objasnjenje rekurzivne funkcije

[ Pregleda: 5326 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

NenadS
Nenad Strainovic
Beograd

Član broj: 857
Poruke: 910
*.dynamic.sbb.rs.

Sajt: www.strainovic.com


+7 Profil

icon Objasnjenje rekurzivne funkcije22.08.2009. u 20:47 - pre 177 meseci
Code:
    function fak($n)
    {
        echo "Ulaz $n<br>";

        if ($n == 0)
        {
            return 1;
        }
        else
        {
            $rezultat = $n*fak($n-1);
            echo "Izlaz $n = $rezultat<br>";
            return $rezultat;
        }
    }


Code:
Ulaz 5
Ulaz 4
Ulaz 3
Ulaz 2
Ulaz 1
Ulaz 0
Izlaz 1 = 1
Izlaz 2 = 2
Izlaz 3 = 6
Izlaz 4 = 24
Izlaz 5 = 120


Moze li neko da mi objasni princip rada ove funkcije. Zasto krajnje rezultate sortira od 1 do 5 i ispisuje ih na kraju, a ne izmedju svakog ulaza?

Hvala
Pozdrav, NenadS!
 
Odgovor na temu

Tudfa
Jovicevic Vladimir

Član broj: 152699
Poruke: 384
*.dynamic.sbb.rs.



+3 Profil

icon Re: Objasnjenje rekurzivne funkcije22.08.2009. u 21:11 - pre 177 meseci
Ako hoces takav izlaz uradi ovako:

Code:

<?php
function fak($num)
{
    if ($num == 0) return 1;
    return $num * fak($num - 1);
}

for($i = 1; $i <= 5; $i++)
{
    echo "ulaz = $i , izlaz = ".fak($i)."<br>";
}    

?>


Dobices ovakav izlaz:

Code:

ulaz = 1 , izlaz = 1
ulaz = 2 , izlaz = 2
ulaz = 3 , izlaz = 6
ulaz = 4 , izlaz = 24
ulaz = 5 , izlaz = 120

Sto se tice rada te tvoje funkcije , sve u redu, ona racuna faktorijel nekog broja...
 
Odgovor na temu

NenadS
Nenad Strainovic
Beograd

Član broj: 857
Poruke: 910
*.dynamic.sbb.rs.

Sajt: www.strainovic.com


+7 Profil

icon Re: Objasnjenje rekurzivne funkcije22.08.2009. u 21:29 - pre 177 meseci
Ne, nisi me dobro razumeo, ne treba mi drugaciji izlaz, vec mi treba objasnjenje zasto ovo ovako radi, to je sve :)
Pozdrav, NenadS!
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-1.sezampro.yu.



+33 Profil

icon Re: Objasnjenje rekurzivne funkcije22.08.2009. u 21:49 - pre 177 meseci
Samo prati kod...

Sve započinje ovim pozivom: fak(5). I onda odma' ide ispis Ulaz 5. Da li je 5 = 0? Nije, ide se na ovaj else, a u njemu je rekurzivan poziv, i to: 5*fak(4). Obrati pažnju da se posle te linije NE ide na ovu ispod, već se opet poziva f-ja fak(). To je i razlog zašto se prvo ispisuje tih pet redova "Ulaz x"...

Kad se stigne do momenta kada je poziv 1*fak(0), to će dati rezultat 1, bez rekurzivnog poziva, pošto će se ući u taj prvi if (if ($num == 0)), i onda kreće taj ispis "Izlaz...". I onda sve ide "u nazad" pošto je životni vek te promenljiva $rezultat samo unutar f-je fak(), a imao si rekurzivne pozive koji su toj promenljivoj dodeljivali vrednosti.

Bilo bi najbolje kad bi nekako mogao da ti nacrtam sve to...

[Ovu poruku je menjao Nikola Poša dana 22.08.2009. u 22:59 GMT+1]
 
Odgovor na temu

NenadS
Nenad Strainovic
Beograd

Član broj: 857
Poruke: 910
*.dynamic.sbb.rs.

Sajt: www.strainovic.com


+7 Profil

icon Re: Objasnjenje rekurzivne funkcije22.08.2009. u 22:16 - pre 177 meseci
Ovaj prvi deo razumem zasto prvo ispisuje od 5 do 0 ali ne razumem drugi deo gde ispisuje od 1 do 5 kada tu ne vidim nikakvu petlju ili rekurzivno pozivanje? To mi nije jasno :(
Pozdrav, NenadS!
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Objasnjenje rekurzivne funkcije22.08.2009. u 23:07 - pre 177 meseci
Zato što svaki poziv funkcije fak() završava ispisom rezultata. Evo slične ilustracije:



Vidiš kako kada fak(2) pozove fak(1) i ona pozove fak(0) prvo rezultat ispisuje fak(0), pa onda se nastavi izvršavanje fak(1), i tako do poslednje funkcije.


Citat:
Tudfa: Ako hoces takav izlaz uradi ovako...


Nadam se da ti je jasna implikacija na brzinu tvog koda jer za svaku iteraciju računaš celo rekurzivno spuštanje. Bolje je:

Code:

<?php
function fak($num) {
    if ($num == 0) return 1;
    $res = $num * fak($num - 1);
    echo "ulaz = $num, izlaz = $res<br>\n";
    return $res;
}

fak(5);
?>




[Ovu poruku je menjao Goran Rakić dana 23.08.2009. u 00:19 GMT+1]
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

Tudfa
Jovicevic Vladimir

Član broj: 152699
Poruke: 384
*.dynamic.sbb.rs.



+3 Profil

icon Re: Objasnjenje rekurzivne funkcije22.08.2009. u 23:57 - pre 177 meseci
Citat:
Goran Rakić: Nadam se da ti je jasna implikacija na brzinu tvog koda jer za svaku iteraciju računaš celo rekurzivno spuštanje.

Da u pravu si, bilo bi vise poziva funkcije sto je veci broj za koji se trazi faktorijel, hvala na hintu Gorane
 
Odgovor na temu

[es] :: PHP :: Objasnjenje rekurzivne funkcije

[ Pregleda: 5326 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.