Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Obliczenie silni rekurencyjnie, obliczenia rekurencyjne
Jozjasz
post 26.09.2009, 22:41:55
Post #1





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 11.09.2009

Ostrzeżenie: (0%)
-----


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

Ten post edytował Jozjasz 27.09.2009, 01:09:21
Go to the top of the page
+Quote Post
Wolfie
post 26.09.2009, 22:44:38
Post #2





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Radze sprawdzic jaki jest wzor na silnie i sprawa sie wyjasni....
Go to the top of the page
+Quote Post
Jozjasz
post 27.09.2009, 17:43:23
Post #3





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 11.09.2009

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
Wolfie
post 27.09.2009, 18:27:33
Post #4





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Po pierwsze to co to ma oznaczac to slowo 'silnia' wewnatrz funkcji ?
Go to the top of the page
+Quote Post
cojack
post 27.09.2009, 18:36:13
Post #5





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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.

Ten post edytował cojack 27.09.2009, 18:36:25


--------------------
cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena
Go to the top of the page
+Quote Post
kipero
post 27.09.2009, 18:41:01
Post #6





Grupa: Zarejestrowani
Postów: 233
Pomógł: 50
Dołączył: 28.10.2006
Skąd: Radom

Ostrzeżenie: (0%)
-----


  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))))


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2025 - 04:23