Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Rekurencja, Rekurencja
bigos1995-95
post
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
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
Crozin
post
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
Post #3





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

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


Nic się nie dzieje (IMG:style_emoticons/default/smile.gif) Zwraca błąd.
Go to the top of the page
+Quote Post
bigos1995-95
post
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
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
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
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 (IMG:style_emoticons/default/smile.gif)




Go to the top of the page
+Quote Post
bigos1995-95
post
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
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.
Go to the top of the page
+Quote Post
markonix
post
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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
bigos1995-95
post
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
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
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
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
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
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
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 (IMG:style_emoticons/default/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
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
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
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 (IMG:style_emoticons/default/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
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.12.2025 - 08:45