Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Rekurencja w klasie
-greg712-
post 23.01.2012, 22:31:09
Post #1





Goście







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
Go to the top of the page
+Quote Post
piotrooo89
post 23.01.2012, 22:38:42
Post #2


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




przecież nie masz warunku stopu w tej rekurencji więc robi Ci się nieskończenie wiele razy.


--------------------
Go to the top of the page
+Quote Post
-greg712-
post 23.01.2012, 22:49:12
Post #3





Goście







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ź.
Go to the top of the page
+Quote Post
piotrooo89
post 23.01.2012, 22:50:32
Post #4


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




hint: wpisz w google silnia i zaimplementuj algorytm.


--------------------
Go to the top of the page
+Quote Post
-greg712-
post 23.01.2012, 23:31:18
Post #5





Goście







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 :/
Go to the top of the page
+Quote Post
ShadowD
post 23.01.2012, 23:35:55
Post #6





Grupa: Zarejestrowani
Postów: 1 333
Pomógł: 137
Dołączył: 25.03.2008
Skąd: jesteś??

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


Pokaż co już masz, bo wynika z Twojej wypowiedzi, że przerobiłeś swój przykład.


--------------------
Mój blog - o wszystkim i niczym ale zazwyczaj związane z informatyką! ;-)
Githube

Usługi spawalnicze i monterskie | Park linowy Lublin i Okunince
Go to the top of the page
+Quote Post
-greg712-
post 23.01.2012, 23:38:35
Post #7





Goście







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. }

Go to the top of the page
+Quote Post
prowseed
post 23.01.2012, 23:43:46
Post #8





Grupa: Zarejestrowani
Postów: 433
Pomógł: 64
Dołączył: 29.01.2011
Skąd: Warszawa

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


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?

Ten post edytował prowseed 23.01.2012, 23:46:57


--------------------
Go to the top of the page
+Quote Post
-greg712-
post 23.01.2012, 23:47:40
Post #9





Goście







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?
Go to the top of the page
+Quote Post
-greg712-
post 23.01.2012, 23:51:01
Post #10





Goście







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ć?
Go to the top of the page
+Quote Post
ShadowD
post 24.01.2012, 00:10:01
Post #11





Grupa: Zarejestrowani
Postów: 1 333
Pomógł: 137
Dołączył: 25.03.2008
Skąd: jesteś??

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


private function SilniaR(){
echo $this->argument;
}
Jaki wynik?


--------------------
Mój blog - o wszystkim i niczym ale zazwyczaj związane z informatyką! ;-)
Githube

Usługi spawalnicze i monterskie | Park linowy Lublin i Okunince
Go to the top of the page
+Quote Post
-greg712-
post 24.01.2012, 00:12:30
Post #12





Goście







@ShadowD - ten, który definiuje już po wyjściu z klasy, teraz akurat 6.

  1. $s1 = new Silnia(6);
  2. $s1->Wyswietl();
Go to the top of the page
+Quote Post
untorched
post 24.01.2012, 00:23:05
Post #13





Grupa: Zarejestrowani
Postów: 318
Pomógł: 76
Dołączył: 27.12.2011
Skąd: Dąbrowa Górnicza

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


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();
Go to the top of the page
+Quote Post
-greg712-
post 24.01.2012, 00:30:27
Post #14





Goście







@untorched W końcu działa... dziękuje bardzo Tobie oraz wszystkim, którzy się zaangażowali w pomoc wink.gif
Pozdrawiam
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: 18.08.2025 - 14:34