Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Obliczenie silni rekurencyjnie
Forum PHP.pl > Forum > Przedszkole
Jozjasz
Widzę że sporo dusz pisze tu na forum, jak widać PHP nie jest taki łatwy

Mam z książki taki przykład na wykorzystanie funkcji do obliczenia rekurencyjnie silni. Nie rozumiem jednak jak ten skrypt - krótki co prawda - działa. Chodzi mi konkretnie o linijkę:

  1. else {return $n*silnia($n-1);}


ja to czytam tą linijkę tak: ma zwrócić: 5*5*-4, bo pod $n kryje się 5, a pod "silnia" też 5... ale chyba odczytuję ją źle... questionmark.gif

Cały skrypt wygląda on tak:

  1. <?
  2. function silnia ($n) {
  3.  
  4. if ($n==0) {return 1; }
  5. else {return $n*silnia($n-1);}
  6.  
  7. }
  8.  
  9. print ("5! = ".silnia(5));
  10. ?>


Czy jakaś dobra dusza mołaby mi to po kroku wyjaśnić co z czego i dlaczego ?

Pozdro i dzięki
Wolfie
Radze sprawdzic jaki jest wzor na silnie i sprawa sie wyjasni....
Jozjasz
To co nikt nie chce pomóc ? Czy $n=5 i silnia=5 ? Chyba jednak tak nie jest, ale nie wiem dlaczego i jak PHP tą linijkę odczytuje...
Wolfie
Po pierwsze to co to ma oznaczac to slowo 'silnia' wewnatrz funkcji ?
cojack
Jak to jak to działa, proste jak budowa cepa, przy tym returnie z else, funkcja się sama wywołuje ponownie z wartością o jeden mniejszą, to tak jak byś zrobił pętlę z dekrementacją.

Czyli algorytm się wywoła tak:

5, czy pięć jest równe zero? Nie wywołaj funkcję jeszcze raz z wartością o jeden mniejszą a wynik pomnóż przez pięć,
4 czy cztery jest równe zero? Nie wywołaj funkcję jeszcze raz z wartością o jeden mniejszą a wynik pomnóż przez cztery,
3 czy trzy jest równe zero? Nie wywołaj funkcję jeszcze raz z wartością o jeden mniejszą a wynik pomnóż przez trzy,
2 czy dwa jest równe zero? Nie wywołaj funkcję jeszcze raz z wartością o jeden mniejszą a wynik pomnóż przez dwa,
1 czy jeden jest równe zero? Nie wywołaj funkcję jeszcze raz z wartością o jeden mniejszą a wynik pomnóż przez jeden, (czyli bez zmian, tutaj już można byłoby zakończyć działanie),
0 czy jeden jest równe zero? Tak, zwróć wartość wyniku funkcji.

dziękuje.
kipero
  1. <?
  2. function silnia ($n) {
  3.  
  4. if ($n==0) {return 1; }
  5. else {return $n*silnia($n-1);}
  6.  
  7. }
  8.  
  9. print ("5! = ".silnia(5));
  10. ?>


Rekurencja to w skrócie odwoływanie się przez funkcję do samej siebie. Deklarujesz funkcję o nazwie silnia, która odwołuje się do samej siebie.
Tak wygląda przebieg wywołania funkcji silnia dla $n = 5:
Kod
return 5 * silnia(4) =>
return 5 * (4 * silnia(3)) =>
return 5 * (4 * (3 * silnia(2))) =>
return 5 * (4 * (3 * (2 * silnia(1)))) =>
return 5 * (4 * (3 * (2 * (1))))
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.