PHP lekcije - lekcija 9 - Rekurzija
U prošloj lekciji smo obradili korišćenje funkcija u PHP-u. Sada ćemo se malo dublje pozabaviti njihovom upotrebom. Do sada smo razmatrali funkcije ovakvog tipa:
<?php function myFunction(){ // definicija funkcije } $x = myFunction(); // poziv funkcije ?>
Ali šta se dešava ako pozovemo funkciju unutar njenog tela?
<?php function myFunction(){ $x = myFunction(); ... return $x; } $y = myFunction();
Taj poziv funkcije unutar iste funkcije naziva se rekurzija. To može delovati komplikovano u teoriji, ali u praksi je mnogo jednostavnije.
Hajde da napravimo funkciju za računanje stepena broja. Iz kursa algebre verovatno znate da n-ti stepen broja znači da se broj množi sam sa sobom n puta. U PHP-u to izgleda ovako:
<?php function myDegree($x, $n){ if($n == 0){ return 1; } if($n < 0){ return myDegree( 1/$x, -$n); // -$n menja znak sa negativnog na pozitivan } return $x * myDegree($x, $n-1); // poziv funkcije unutar funkcije } $y = myDegree(2, -4); // prvi poziv funkcije print $y; ?>
Detaljno ćemo objasniti ovu funkciju. Počinjemo sa time da posle linije return funkcija prestaje sa izvršavanjem i vraća vrednost navedenu u return.
Prvi if ($n == 0) - ako je stepen 0, vraća se 1. Ovo je jasno i jednostavno: bilo koji broj na nulti stepen je 1. Sledeći if ($n < 0) - ako je stepen negativan, pretvaramo ga u pozitivan, a broj koji se diže na stepen menjamo u njegov recipročni oblik, što je matematički ispravno.
Na kraju, ako stepen nije 0 niti negativan, funkcija se poziva rekurzivno sa smanjenim stepenom za 1 i svaki put množimo broj sa rezultatom prethodnog poziva funkcije.
Hajde da pratimo svaku iteraciju (ponavljanje) funkcije:
1. Stepen -4, broj 2.
Ovde se izvršava drugi if, broj postaje razlomak, a stepen pozitivan.
2. Stepen 4, broj 0,5.
Stepen je pozitivan i nije 0, zato se izvršava:
return $x * myDegree($x, $n-1)
3. Stepen 3, broj 0,5.
4. Stepen 2, broj 0,5.
5. Stepen 1, broj 0,5.
Ovde se aktivira prvi if, vraća se 1, koja se množi sa prethodnim rezultatima, i rekurzija se završava.
Još jedan sličan primer je faktorijal broja. Faktorijal broja n je proizvod svih brojeva od 1 do n. Na primer, faktorijal broja 6 je 6*5*4*3*2*1 = 720. Kao što ste verovatno pretpostavili, koristićemo rekurziju.
<?php function myRecursion($x){ if($x == 1){ return $x; } return $x * myRecursion($x-1); } $y = myRecursion(8); print $y; ?>
Ovaj primer je još jednostavniji od prethodnog, pa ću vam ostaviti da sami pratite promene parametra u funkciji myRecursion.