Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Rekurencja, Rekurencja
bigos1995-95
post 11.08.2012, 16:10:12
Post #1





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 18.05.2012

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


Witam, mógłby mi ktoś po kolei, że tak się wyrażę "jak chłopu na miedzy" przybliżyć poniższy kod ? Co się dzieje krok po kroku. Z góry dzieki;)

  1. function odwroc_r($lancuch) {
  2. if (strlen($lancuch)>0) {
  3. odwroc_r(substr($lancuch, 1));
  4. }
  5. echo substr($lancuch, 0, 1);
  6. return;
  7. }
  8.  
  9. odwroc_r('Czesc');
  10.  


Ten post edytował bigos1995-95 11.08.2012, 17:11:40
Go to the top of the page
+Quote Post
Crozin
post 11.08.2012, 16:15:26
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Zainstaluj sobie debugger (np. xdebug) i wykonaj sobie cały kod krok po kroku. Google/YouTube: PHP Eclipse xDebug (netbeans czy inne IDE jakiego tam używasz).

Ten post edytował Crozin 11.08.2012, 16:15:38
Go to the top of the page
+Quote Post
Bateria
post 11.08.2012, 16:15:44
Post #3





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 23.11.2011

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


Nic się nie dzieje smile.gif Zwraca błąd.


--------------------
Go to the top of the page
+Quote Post
bigos1995-95
post 11.08.2012, 17:13:08
Post #4





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 18.05.2012

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


Nie zwraca błędu, działa. Sprawdź jeszcze raz. A co do tego debugowania nie mam zielonego pojęcia co to jest i o co w tym chodzi ale próbuje się dowiedzieć; )
Go to the top of the page
+Quote Post
markonix
post 11.08.2012, 17:23:36
Post #5





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Wklejając kod na forum ułatwiłeś sobie zbadanie tego skryptu bo funkcje użyte w tym skrypcie ładnie są zalinkowane do wyjaśnienia ich działania.
Debugera nie musisz instalować, na kartce sobie rozpisz co się dzieje np. ze słowem "123".


--------------------
Go to the top of the page
+Quote Post
bigos1995-95
post 11.08.2012, 18:17:09
Post #6





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 18.05.2012

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


ja wiem co robia funkcje strlen, substr. Dobra napisze jaka ja to rozumiem.

function odwroc_r($lancuch) - tworzy sie nowa funkcja o nazwie odwroc_r
if (strlen($lancuch)>0) - jesli ilosc znakow(w przypadku slowa 'czesc' jest ich 5) jest wieksza od 0 to wykonuje sie dalsza czesc kodu
odwroc_r(substr($lancuch, 1)); i tutaj do konca nie rozumiem co robi odwroc_r bo dalej funkcja substr jest od ciagow (wiadomo ze pierwsza literka/cyferka ciagu to 0) a tutaj jest 1 czyli zapisze w pamieci wyraz poczynajac od drugiego znaku czyli 'zesc'
echo substr($lancuch, 0, 1); wyswietla pierwszy znak ciagu czyli C?
return; zamyka funkcje


co ja w tym zle rozumiem? i co dokladnie robi powtórzenie funkcji odwroc_r?


Ciekawi mnie również to debugowanie o co w tym chodzi i do czego ma sie mi to przydac?
Go to the top of the page
+Quote Post
d3ut3r
post 11.08.2012, 18:44:37
Post #7





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

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


pomysł z debuggerem polega na uruchomieniu kodu step by step, środowisko będzie Ci pokazywało linijkę którą wykonuje i po każdej linii bedzie czekało na twoją reakcję (możesz sterować wykonaniem np iść krok dalej lub cofnąć itd.)

Powtórzenie funkcji jak napisałeś, tworzy z tej funkcji funkcję rekurencyjną, czyli taką która wywołuje samą siebie. Rekurencja ogólnie jest mało wydajna i powinno się jej unikać, a źle napisana funkcja rekurencyjna może spowodować dość duże problemy (wyczerpanie zasobów). Najlepiej rekurencje obrazuje funkcja obliczające silnie. Jak wiadomo silnia(5) = silnia(4)*5, silnia(4)=silnia(3)*4 itd.

Ten fakt można wykorzystać do obliczania silni w sposób rekurencyjny czyli jeżeli x>1 policz silnie dla x-1 w końcu dojdziemy do x=1 gdzie silnia jest równa 1 smile.gif






--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
bigos1995-95
post 11.08.2012, 19:27:29
Post #8





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 18.05.2012

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


To debugowanie odbywa się w jakimś programie ? Jak tak to jakim? I jaki kod wczytać, skąd? (sorki ale jestem zielony w tym kierunku, nic o tym nigdy nie slyszalem)




A co do mojego kodu powyżej, czy rekurencja przyda mi się w dalszej nauce php ? w klasach moze w bazie mysql ? Bo jeśli nie to nie widze sensu głebszego dociekania z ta rekurencja.
Go to the top of the page
+Quote Post
scanner
post 11.08.2012, 19:39:28
Post #9





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Rekurencja to jeden z problemów matematycznych, logicznych oraz programistycznych - wypada wiedzieć co to jest, jak działa i gdzie się przydaje.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
markonix
post 11.08.2012, 19:40:33
Post #10





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Rekurencje dobrze znać bo to dosyć ciekawe pojęcie programistyczne.

Przydaje się np. przy strukturach drzewkowych (menu).
Osobiście chyba nigdy jej nie użyłem w moich projektach smile.gif


--------------------
Go to the top of the page
+Quote Post
bigos1995-95
post 11.08.2012, 21:33:46
Post #11





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 18.05.2012

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


Tak właśnie słyszałem i mam nawet w książce napisane że rekurencja się raczej nie przydaje i lepiej ja zastąpić iteracją bo szybciej działa ale hmmm....ale jednak przydałoby się z nią zapoznać. Z książki dowiedziałem się bardzo mało ponieważ miałem tam tylko jeden przykład z rekurencją.I tu pytanie do was, gdzie mogę się lepiej z nią zapoznać czy to w programowaniu czy w matematyce. Jakieś poradniki, zadania?
Go to the top of the page
+Quote Post
IceManSpy
post 11.08.2012, 21:47:20
Post #12





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


A w google szukałeś? Przecież tam jest tyle informacji i przykładów. A tutaj choć porównanie rekurencji i iteracji (nie czytałem tego, tylko znalazłem):
http://www.bryk.pl/teksty/liceum/pozosta%C...%C5%84stwa.html


--------------------
Go to the top of the page
+Quote Post
bigos1995-95
post 12.08.2012, 02:58:48
Post #13





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 18.05.2012

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


Tak właśnie nie czytałeś tego nawet nie spojrzałeś ze tam są podane przykłady z pascala którego ja się nie uczę. Jeśli ktoś zna bardziej "sprawdzone" źródła bardzo bym prosił a jeśli nie to będę musiał sobie sam jakoś poradzić : )
Go to the top of the page
+Quote Post
markonix
post 12.08.2012, 07:20:42
Post #14





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Co z tego, że z Pascala jak tu nie chodzi o naukę składni tylko algorytmu.
A jeżeli uczysz się PHP to weź się za bardziej przyziemne pojęcia, a ciekawostki zostaw sobie na potem.

Trudno w Google wpisać PHP Rekurencja przykład (jeszcze lepiej po angielsku)?

Ten post edytował markonix 12.08.2012, 07:21:01


--------------------
Go to the top of the page
+Quote Post
bigos1995-95
post 12.08.2012, 11:10:11
Post #15





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 18.05.2012

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


Więc tak , trochę poczytałem ale nic mi to nie dało. Znalazłem pewien kod który podam niżej którego nie rozumiem ponieważ nie wiem jak go rozpatruje php.

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



ten zam kod tylko w 6 linijce zamiast return dalem echo co zworci bledny wynik

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





w pierwszym kodzie wynik z obliczenia silni 3 bedzie 6 co jest prawda
a w drugim kodzie wynik bedzie 20



i tu mam problem jak w drugim kodzie program pomnożył liczby ze wyszło mu 20. Myslalem ze to jest tak 3*2*3*1 ale tu oczywiscie wychodzi 18 a w moim kodzie 20, wiec jak to sie stalo ze wyszlo 20?
Go to the top of the page
+Quote Post
greycoffey
post 12.08.2012, 14:28:39
Post #16





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

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


Po co tam echo? Po co w funkcjach echo?

Twój kod robi tak:

Kod
silnia(3):
  wyświetl 3*silnia(2)
    silnia(2):
      wyświetl 2*silnia(1)
        silnia(1):
          zwróc 1
      wyświetla 2*1=2
      zwróc 0 (bo funkcja nic nie zwraca)
  wyświetla 3*0=0
  zwróc 0


Nie wiem jak rekurencja może być czymś trudnym, czytaj więcej zamiast modyfikować kod.

Ten post edytował greycoffey 12.08.2012, 14:29:56
Go to the top of the page
+Quote Post
Yorki
post 12.08.2012, 14:42:22
Post #17





Grupa: Zarejestrowani
Postów: 45
Pomógł: 2
Dołączył: 12.09.2005

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


Cytat(greycoffey @ 12.08.2012, 13:28:39 ) *
Po co tam echo? Po co w funkcjach echo?

Twój kod robi tak:

Kod
silnia(3):
  wyświetl 3*silnia(2)
    silnia(2):
      wyświetl 2*silnia(1)
        silnia(1):
          zwróc 1
      wyświetla 2*1=2
      zwróc 0 (bo funkcja nic nie zwraca)
  wyświetla 3*0=0
  zwróc 0


Nie wiem jak rekurencja może być czymś trudnym, czytaj więcej zamiast modyfikować kod.


Jak silnia z 3 może się równać zero? Przegapiłeś warunek, że liczba jest większa od 1.

EDIT:

Zasada działania rekurencji jest bardzo prosta, jest to wywoływanie funkcji przez samą siebie. W tym przypadku jeśli wywołamy funkcję z argumentem 3 :

silnia(3);

Funkcja zostaje wywołana, nie spełnia warunku 3<2, więc jako wynik funkcji zostanie zwrócone 3 * silnia(3-1), więc znowu zostaje wywołana funkcja

silnia(2);

Funkcja zostaje wywołana, nie spełnia warunku 2<2, więc jako wynik funkcji zostanie zwrócone 2 * silnia(2-1), więc znowu zostaje wywołana funkcja

silnia(1);

Funkcja zostaje wywołana, spełnia warunek 1<2 więc zostaje zwrócona jedynka czyli do działania 2 * silnia(2-1) podstawiamy 1 co daje : 2 * 1.

2 * 1 jest wynikiem silnia(3-1), a więc pod 3 * silnia(3-1) podstawiamy odpowiednio 3 * 2 * 1

A więc to co zwróci silnia(3) to właśnie 3 * 2 * 1 co daje 6 i jest to poprawny wynik wink.gif

----------
Warto dodać, że w tym czasie wywołanie silnia(3) czeka na rezultat silnia(2) z kolei ta na rezultat silnia(1), jeśli nie będzie warunku ograniczającego to funkcja będzie wywoływała samą siebie w nieskończoność. (infinity loop)

Ten post edytował Yorki 12.08.2012, 14:56:40
Go to the top of the page
+Quote Post
bigos1995-95
post 12.08.2012, 16:29:51
Post #18





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 18.05.2012

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


Rozumiem jak dziala ta funkcja:

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


ale nie rozumiem jak dziala ta z ciagami wiec myslalem ze jak zrozumie ta funkcje powyżej tylko z uzyciem echo to zrozumie tez ta funkcje z ciagami
Go to the top of the page
+Quote Post
IceManSpy
post 12.08.2012, 16:32:42
Post #19





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

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


Rozpisz sobie na kratce, będzie Ci łatwiej. Z resztą strasznie uparłeś się, że chcesz się nauczyć rekurencji. Jak nie możesz jej teraz przyswoić to daj odpocząć umysłowi z 1 dzień, a potem pójdzie Ci łatwiej.


--------------------
Go to the top of the page
+Quote Post
bigos1995-95
post 12.08.2012, 17:07:54
Post #20





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 18.05.2012

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


No niestety taki jestem że jak czegoś nie wiem to będę siedział i tydzień ale to pojmę. Dobra namieszałem trochę ale wróćmy do początku tematu:
Mam funkcje która odwraca ciąg znaków:

  1. function odwroc_r($lancuch) {
  2. if (strlen($lancuch)>0) {
  3. odwroc_r(substr($lancuch, 1));
  4. }
  5. echo substr($lancuch, 0, 1);
  6. return;
  7. }
  8.  
  9. odwroc_r('Czesc');


I jest taka sprawa jak już wcześniej napisałem rozumiem wszystko do tego momentu 'odwroc_r(substr($lancuch, 1));'. Funkcja wywołuje sama siebie poczynając od drugiego znaku czyli wywoła: odwroc_r('zesc');, odwroc_r('esc');, odwroc_r('sc');, odwroc_r('c');, odwroc_r(' '); i tu nagle pach magia i z tego zrobiło się słowo 'csezC' i oczywiście nastepną linijke która wywołała mi słowo 'csezC' tez rozumiem chooociaz tak nie do konca. Wiem ze substr($lancuch, 0, 1); wywoła pierwszy znak. Czyli jakbym np napisał tak: $lancuch = '123'; echo substr($lancuch, 0, 1); to wyświetli '1' ale co z tego jak mi tu jakies magiczne 'csezC' wyskoczyło biggrin.gif

Ten post edytował bigos1995-95 12.08.2012, 17:10:01
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 13.06.2025 - 00:46