Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rekurencja
Forum PHP.pl > Forum > PHP
nikestylex7
Witam próbuje i mi nie wychodzi. Wiem że chodzi o wywołanie funkcji przez samą siebie lecz nie wiem nawet czy nie idę w ślepy kąt bo nie wiem czy jest ona w stanie mi pomóc.
oto przykład w którym chciałbym kontrolować ilość kombinacji a mianowicie zmniejszać pętle for na tyle ile chciałbym sobie wybrać.

  1. $liczby = array( '1','X','2' );
  2. $kupon = 0; //specjalnie zaczynam od 0, bo pierwszy cykl od razu nam zamieni zmieną $kupon na 1
  3. $licznik = 0; //to nam będzie się ciagle zmieniać
  4. $wzorzec = 'Kupon ';
  5. $nazwa1= 'Legia Warszawa - Pogoń Szczecin :';
  6. $nazwa2= 'Manchester United - Arsenal :';
  7. $nazwa3= 'Barcelona - Manchester City :';
  8. $nazwa4= 'AC Milan - Juventus :';
  9. $nazwa5= 'Legia Warszawa - Pogoń Szczecin :';
  10. $nazwa6= 'Pogoń Szczecin - Manchester United :';
  11. $nazwa7= 'Borussia Dortmund - Arsenal :';
  12. $nazwa8= 'Barcelona - Pogoń Szczecin :';
  13. $nazwa9= 'Barcelona - Legia Warszawa :';
  14. $nazwa10= 'Arsenal - Barcelona :';
  15. $kombinacje = array();
  16. $ilosc_na_kuponie=1; //ilość spotkań na kuponie
  17. $cliczby = count( $liczby );
  18. for( $j = 0; $j < $cliczby; $j++ ) {
  19. for( $i = 0; $i < $cliczby; $i++ ) {
  20. for( $h = 0; $h < $cliczby; $h++ ) { // CHODZI TUTAJ O TE PĘTLE MOŻE REKURENCJA JEST W STANIE POMÓC
  21. for( $g = 0; $g < $cliczby; $g++ ) {
  22. for( $f = 0; $f < $cliczby; $f++ ) {
  23. for( $e = 0; $e < $cliczby; $e++ ) {
  24. for( $d = 0; $d < $cliczby; $d++ ) {
  25. for( $c = 0; $c < $cliczby; $c++ ) {
  26. for( $b = 0; $b < $cliczby; $b++ ) {
  27. for( $a = 0; $a < $cliczby; $a++ ) {
  28. if(0 === $licznik%$ilosc_na_kuponie) {
  29. ++$kupon; // to nam stworzy klucze w tablicy, w stylu "kupon_1", "kupon_2" itd
  30. }
  31. ++$licznik;
  32. $kombinacje[$wzorzec.$kupon] = '<br />'.$nazwa1.$liczby[$a].'<br />'.$nazwa2.$liczby[$b].'<br />'.$nazwa3.$liczby[$c].'<br />'.$nazwa4.$liczby[$d].'<br />'.$nazwa5.$liczby[$e].'<br />'.$nazwa6.$liczby[$f].'<br />'.$nazwa7.$liczby[$g].'<br />'.$nazwa8.$liczby[$h].'<br />'.$nazwa9.$liczby[$i].'<br />'.$nazwa10.$liczby[$j]; // a to nam utworzy właściwe tablice z kombinacjami kuponów
  33. }
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }
  40. }
  41. }
  42. }
  43.  
adbacz
W takim razie zrób funkcję, w której będzie tylko jedna pętla for. Widzę, że każda operuje na tej samej ilości danych ($cliczby) więc nie będzie problemu. Napisze tutaj tylko prototyp, resztę sobie musisz wykoncypować, bo dokładnie nie wiem na co Ci takie coś bo nie podałeś żadnych informacji.

  1. function makeThis($iterations, $cliczby, $kupon, $kombinacje)
  2. {
  3. for( $i = 0; $i < $cliczby; $i++ ) {
  4. // jeśli skończyły nam się zagnieżdżenia, to wykonujemy kod przypisania wartości do zmiennej
  5. if($iterations <= 0)
  6. {
  7. // Tutaj Twój kod z linijki 32
  8. }
  9. // W innym wypadku wywołujemy samą siebie, zmniejszamy iterację i przesyłamy te wszystkie parametry jeszcze raz
  10. else
  11. {
  12. makeThis(--$iterations, $cliczby, $kupon, $kombinacje)
  13. }
  14. }
  15. }


Tych parametrów możesz sobie stworzyć tyle, ile chcesz przesłac danych do tej fukncji. Ale ja, zamiast podawac tyle parametrów, stworzyłbym klasę a w niej te wszystkie parametry jako właściwości, a do tej metody wysłał tylko ilośc iteracji do wykonania ($iterations).

Mam nadzieje, że to Ci pomoże w jakiś sposób. Nie sprawdzałem działa więc nie jestem pewien co do tego skryptu.
nikestylex7
Już tłumacze. Chodzi o to że każda z tych pętli for to jedno spotkanie z 3 kombinacjami więcej. A w tym skrypcie chciałbym przerobić te staje pętlę for na takie którymi mógłbym operować czyli zmieniać zwiększać je lub zmniejszać. Jest teraz ich 10a chciałbym np 9 to muszę usuwać je z kodu a nie chce tego robić.


adbacz męczę się z Twoim przykładem i dalej nic skrypt praktycznie się nie wyświetla.

Stworzyłem takie coś lecz to nie działa poprawnie.

  1. $liczby = array( '1','X','2' );
  2. $kupon = 0; //specjalnie zaczynam od 0, bo pierwszy cykl od razu nam zamieni zmieną $kupon na 1
  3. $licznik = 0; //to nam będzie się ciagle zmieniać
  4. $wzorzec = 'Kupon ';
  5. $nazwa1= $spotkanie;
  6. $nazwa2= 'Manchester United - Arsenal :';
  7. $nazwa3= 'Barcelona - Manchester City :';
  8. $nazwa4= 'AC Milan - Juventus :';
  9. $nazwa5= 'Legia Warszawa - Pogoń Szczecin :';
  10. $nazwa6= 'Pogoń Szczecin - Manchester United :';
  11. $nazwa7= 'Borussia Dortmund - Arsenal :';
  12. $nazwa8= 'Barcelona - Pogoń Szczecin :';
  13. $nazwa9= 'Barcelona - Legia Warszawa :';
  14. $nazwa10= 'Arsenal - Barcelona :';
  15. $kombinacje = array();
  16. $ilosc_na_kuponie=1; //ilość spotkań na kuponie
  17. $cliczby = count( $liczby );
  18. $iterations=0;
  19. function makeThis($iterations, $cliczby, $kupon, $kombinacje)
  20. {
  21. for( $i = 0; $i < $cliczby; $i++ ) {
  22. // jeśli skończyły nam się zagnieżdżenia, to wykonujemy kod przypisania wartości do zmiennej
  23. if($iterations <= 0)
  24. {
  25. if(0 === $licznik%$ilosc_na_kuponie) {
  26. ++$kupon; // to nam stworzy klucze w tablicy, w stylu "kupon_1", "kupon_2" itd
  27. }
  28. ++$licznik;
  29. $kombinacje[$wzorzec.$kupon] = '<br />'.$nazwa1.$liczby[$a].'<br />'.$nazwa2.$liczby[$b].'<br />'.$nazwa3.$liczby[$c].'<br />'.$nazwa4.$liczby[$d].'<br />'.$nazwa5.$liczby[$e].'<br />'.$nazwa6.$liczby[$f].'<br />'.$nazwa7.$liczby[$g].'<br />'.$nazwa8.$liczby[$h].'<br />'.$nazwa9.$liczby[$i].'<br />'.$nazwa10.$liczby[$j]; // a to nam utworzy właściwe tablice z kombinacjami kuponów
  30. print $kombinacje;
  31. }
  32. // W innym wypadku wywołujemy samą siebie, zmniejszamy iterację i przesyłamy te wszystkie parametry jeszcze raz
  33. else
  34. {
  35. makeThis(--$iterations, $cliczby, $kupon, $kombinacje);
  36. }
  37. }
  38. }


?
adbacz
Nic nie wyświetla? Włącz proszę raportowanie błędów. Wydaje mi się, że niezbyt dobrze wiesz, jak działają funkcje. Poza tym, gdzie wywołujesz tą funkcję? Jest jej definicja, ale nie ma jej wywołania.

Co to znaczy: "dalej nic skrypt praktycznie się nie wyświetla" - Nie wyświetla nic, czy wyświetla coś?
nikestylex7
Hmm Undefined variable spotkanie on line 132

Wyświetla pusta tablice , a powinny być w niej kupon_1 kupon_2 z kombinacjami

Wypełniłem zmienną spotkanie i błąd znikł lecz dalej nic pusta tablica.
adbacz
Jeśli wywołujesz tą funkcje, to powinieneś zobaczyć teraz masą błedów, a nie pustą tablicę (Array). Włącz proszę raportowanie błędów:

Sprawdź czego tam brakuje w tej funkcji, i wyślij ewentualnie jako jej parametry. Popróbuj, ja Ci tylko dałem szkic, podsunąłem pomysł, nie jestem o tego, by dawać Ci gotowe rozwiązania. Jeśli chcesz być programistą to musisz troszkę pomyśleć. W najgorszym przypadku poczytaj trochę o funkcjach, na jakiej zasadzie działają itd.
nikestylex7
Tak tylko no mówię nie ma błędów chciałbym je widzieć były tylko do tej zmiennej a potem jak zrobiłem to nic ;/

Aktualnie pod tą kombinacje
  1. function makeThis($iterations, $cliczby, $kupon, $kombinacje)
  2.  
  3. {
  4. $liczby = array( '1','X','2' );
  5. $kupon = 0; //specjalnie zaczynam od 0, bo pierwszy cykl od razu nam zamieni zmieną $kupon na 1
  6. $licznik = 0; //to nam będzie się ciagle zmieniać
  7. $wzorzec = 'Kupon ';
  8. $nazwa1= 'Manchester United - Arsenal :';
  9. $nazwa2= 'Manchester United - Arsenal :';
  10. $nazwa3= 'Barcelona - Manchester City :';
  11. $nazwa4= 'AC Milan - Juventus :';
  12. $nazwa5= 'Legia Warszawa - Pogoń Szczecin :';
  13. $nazwa6= 'Pogoń Szczecin - Manchester United :';
  14. $nazwa7= 'Borussia Dortmund - Arsenal :';
  15. $nazwa8= 'Barcelona - Pogoń Szczecin :';
  16. $nazwa9= 'Barcelona - Legia Warszawa :';
  17. $nazwa10= 'Arsenal - Barcelona :';
  18. $kombinacje = array();
  19. $ilosc_na_kuponie=1; //ilość spotkań na kuponie
  20. $cliczby = count( $liczby );
  21. for( $i = 0; $i < $cliczby; $i++ ) {
  22. // jeśli skończyły nam się zagnieżdżenia, to wykonujemy kod przypisania wartości do zmiennej
  23. $iterations=0;
  24. if($iterations <= 0)
  25. {
  26. if(0 === $licznik%$ilosc_na_kuponie) {
  27. ++$kupon; // to nam stworzy klucze w tablicy, w stylu "kupon_1", "kupon_2" itd
  28. }
  29. ++$licznik;
  30. $kombinacje[$wzorzec.$kupon] = '<br />'.$nazwa1.$liczby[$i]; // a to nam utworzy właściwe tablice z kombinacjami kuponów
  31. echo '<pre>';
  32. print_r( array_slice($kombinacje,0,100) );
  33. echo '</pre>';
  34. }
  35. // W innym wypadku wywołujemy samą siebie, zmniejszamy iterację i przesyłamy te wszystkie parametry jeszcze raz
  36. else
  37. {
  38. makeThis(--$iterations, $cliczby, $kupon, $kombinacje);
  39.  
  40. }
  41.  
  42. }
  43.  
  44. }
  45. makeThis($iterations, $cliczby, $kupon, $kombinacje);


Są następujące błędy: :
Notice: Undefined variable: iterations in /home/k/public_html/k.php on line 171

Notice: Undefined variable: cliczby in /home/k/public_html/k.php on line 171

Notice: Undefined variable: kupon in /home/k/public_html/k.php on line 171

Poza tym to skrypt wyświetla kombinacje lecz tak
Array
(
[Kupon 1] =>
Manchester United - Arsenal :1
)
Array
(
[Kupon 1] =>
Manchester United - Arsenal :1
[Kupon 2] =>
Manchester United - Arsenal :X
)
Array
(
[Kupon 1] =>
Manchester United - Arsenal :1
[Kupon 2] =>
Manchester United - Arsenal :X
[Kupon 3] =>
Manchester United - Arsenal :2
)

A powinien tak jak jest ostatnia tablica czyli 3 kupony i to w dodatku jest tylko do jednej petli jednego zdarzenia a gdzie jeszcze do tego 9

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