Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Rekurencja w klasie
Forum PHP.pl > Forum > Przedszkole
greg712
Witam serdecznie,
Mam problem z ukończeniem pewnego ćwiczenia, opierającego się na wyliczeniu silni rekurencyjnie, poniżej kawałek kodu:

  1. private function SilniaR(){
  2. return $this->SilniaR($this->argument - 1) * $this->argument;
  3. }


Przy próbie otwarcia tego ćwiczenia, wyrzuca mi:
Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 261904 bytes) in C:\xampp\htdocs\learning\zad1.php on line 18

Linia 18 to akurat ten return. Prośba o pomoc wink.gif
piotrooo89
przecież nie masz warunku stopu w tej rekurencji więc robi Ci się nieskończenie wiele razy.
greg712
A mogę prosić o jakiś mały hint, jak ma taki warunek wyglądać? Dodałem tam if'a jeśli to i jeśli tamto, ale tylko mi się zmniejszył zakres tych danych do przetworzenia... zatem prośba o jakąś podpowiedź.
piotrooo89
hint: wpisz w google silnia i zaimplementuj algorytm.
greg712
Zastosowałem się do Twoich wskazówek, jednakże dalej mam problem... stosując tą funkcję tak:

  1. function silnia($liczba)
  2. {
  3. if($liczba < 2)
  4. return 1;
  5. else
  6. return $liczba*silnia($liczba-1);
  7. }
  8.  
  9. echo silnia(5);


Działa bez problemu, ale na moim przykładzie nie mogę tego wdrożyć bo wywala mi ten sam błąd :/
ShadowD
Pokaż co już masz, bo wynika z Twojej wypowiedzi, że przerobiłeś swój przykład.
greg712
Obecna wersja wygląda tak:

  1. private function SilniaR(){
  2. if ($this->argument< 2)
  3. {
  4. return 1;
  5. }
  6. else
  7. {
  8. return SilniaR($this->argument - 1) * $this->argument;
  9. }
  10. }

prowseed
to pseudokod! Zebys przypadkiem nie probowal tego implementowac, trzeba przepisac
  1. function silnia(n) {
  2. if (n=0) return 1
  3. else {
  4. $licz = n * silnia(n-1);
  5. return $licz;
  6. }
  7. }


jakos tak

//EDIT
a jak przekazujesz argument?
greg712
Z powyższym dalej jestem w tym samym miejscu, niechcę argumentować funkcji, gdyż za argument pobieram liczbę z całej klasy i chyba tutaj mam problem?
greg712
Generalnie aby przybliżyć co nieco:

  1. class Silnia
  2. {
  3. private $argument;
  4.  
  5.  
  6. private function SilniaR(){
  7. if ($this->argument< 2)
  8. {
  9. return 1;
  10. }
  11. else
  12. {
  13. $licz = $this->argument * $this->SilniaR($this->argument -1);
  14. return $licz;
  15. }
  16. }
  17. }


Niechcę jej dawać "nowego" argumentu, tylko wskazać jej ten prywatny, jak to zrobić?
ShadowD
private function SilniaR(){
echo $this->argument;
}
Jaki wynik?
greg712
@ShadowD - ten, który definiuje już po wyjściu z klasy, teraz akurat 6.

  1. $s1 = new Silnia(6);
  2. $s1->Wyswietl();
untorched
OMG.
  1. <?php
  2.  
  3. class Silnia {
  4.  
  5. private $argument = 5; // Jakaś tam prywatna wartość
  6.  
  7. public function SilniaR()
  8. {
  9. if($this->argument == 0)
  10. {
  11. return 1;
  12. }
  13. else
  14. {
  15. $liczba = $this->argument;
  16. $this->argument = $this->argument - 1;
  17. $licz = $liczba * $this->SilniaR();
  18. return $licz;
  19. }
  20. }
  21.  
  22. };
  23.  
  24. $silnia = new Silnia();
  25.  
  26. echo $silnia->SilniaR();
greg712
@untorched W końcu działa... dziękuje bardzo Tobie oraz wszystkim, którzy się zaangażowali w pomoc wink.gif
Pozdrawiam
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.