Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Jak napisać funkcję która wykona pętle FOR n-razy
radiopraca
post
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 1
Dołączył: 7.02.2014

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


Mam taki kod (poniżej) i wyświetla on wszystkie przypadki umieszczenia 4 osób w jednym pokoju.
W takim pokoju może być osoba 1, 2, 3, 4, 1 i 2, 1 i 3 itd.

Kod działa prawidłowo, ale jak trzeba by to poprawić by było uniwersalne i działało dla 1,2,3,4,5... n osób.
Nie chce robić 10 forów jeden w drugim. Pomożecie?

  1. $out = array();
  2. for ($a = 1; $a <= 4; $a++) {
  3. $out[] = $a;
  4.  
  5. for ($b = $a + 1; $b <= 4; $b++) {
  6. $out[] = $a. $b;
  7.  
  8. for ($c = $b + 1; $c <= 4; $c++) {
  9. $out[] = $a. $b. $c;
  10.  
  11. for ($d = $c + 1; $d <= 4; $d++) {
  12. $out[] = $a. $b. $c. $d;
  13. }
  14. }
  15. }
  16. }


Wykonanie kawałka kodu wyżej zwróci:
Array
  1. (
  2. [0] => 1
  3. [1] => 2
  4. [2] => 3
  5. [3] => 4
  6. [4] => 12
  7. [5] => 13
  8. [6] => 14
  9. [7] => 23
  10. [8] => 24
  11. [9] => 34
  12. [10] => 123
  13. [11] => 124
  14. [12] => 134
  15. [13] => 234
  16. [14] => 1234
  17. )


To wszystko jest jednak na sztywno dla 4 osób.
Wie ktoś może jak zrobić by pętli for było tyle ile osób (pętla w pętli)?

Ten post edytował radiopraca 9.02.2014, 22:13:42
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
Kshyhoo
post
Post #2





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Wróżę: trzeba zastąpić liczbę 4 zmienną?


--------------------
Go to the top of the page
+Quote Post
radiopraca
post
Post #3





Grupa: Zarejestrowani
Postów: 14
Pomógł: 1
Dołączył: 7.02.2014

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


To też ale wówczas dla liczby 3 będą tylko 3 pętle for, a dla liczby 5 będzie 5 takich pętli.
Funkcja ma byc uniwersalna i ma obsługiwać dowolne wartości.
Nie bede przecież dla 10 robił 10 pętli for.

Dla 3 osob kod wyglada tak:
  1. $out = array();
  2. for ($a = 1; $a <= 4; $a++) {
  3. $out[] = $a;
  4.  
  5. for ($b = $a + 1; $b <= 4; $b++) {
  6. $out[] = $a. $b;
  7.  
  8. for ($c = $b + 1; $c <= 4; $c++) {
  9. $out[] = $a. $b. $c;
  10. }
  11. }
  12. }


Znika nam jedna petla for.

Ten post edytował radiopraca 9.02.2014, 22:08:51
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #4





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Dopisz tagi do tytułu, przenoszę wątek.


--------------------
Go to the top of the page
+Quote Post
radiopraca
post
Post #5





Grupa: Zarejestrowani
Postów: 14
Pomógł: 1
Dołączył: 7.02.2014

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


Przedszkole przedszkolem ale pomoższ mi rozwiązać problem kolego?
Go to the top of the page
+Quote Post
Greg0
post
Post #6





Grupa: Zarejestrowani
Postów: 264
Pomógł: 54
Dołączył: 31.08.2007
Skąd: Tychy

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


Słowo klucz: funkcja rekurencyjna
Go to the top of the page
+Quote Post
radiopraca
post
Post #7





Grupa: Zarejestrowani
Postów: 14
Pomógł: 1
Dołączył: 7.02.2014

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


Czy chodzi o coś takiego:

  1. function xxx($x, $y = 1) {
  2. $out = array();
  3.  
  4. if ($x > $y) {
  5. for ($a = $y; $a <= $x; $a++) {
  6. $out[] = $a;
  7.  
  8. xxx($x, $a + 1);
  9. }
  10. } else {
  11. return $out;
  12. }
  13. }


Nic nie zwraca mi to wywołanie xxx(4);
Coś chyba nie tak bo nie dopisuje tego a.b.c nigdzie.

Mam juz coś takiego, ale to ciągle nie to:

  1. function xxx($x, $y = 1, $out = array()) {
  2. if ($x > $y) {
  3. for ($a = $y; $a <= $x; $a++) {
  4. $out[] = $a;
  5.  
  6. xxx($x, $y + 1, $out);
  7. }
  8. }
  9.  
  10. return $out;
  11. }


Ten post edytował radiopraca 9.02.2014, 22:26:38
Go to the top of the page
+Quote Post
Greg0
post
Post #8





Grupa: Zarejestrowani
Postów: 264
Pomógł: 54
Dołączył: 31.08.2007
Skąd: Tychy

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


Widzę że próbowałeś więc nie mam oporów żeby ci dać gotowca do przeanalizowania.
  1. function kombinacje($n, $combine=null, $var=0, $out = array()) {
  2. for ($i = $var+1; $i <= $n; $i++)
  3. {
  4. $out[] = $combine.$i;
  5. $out = kombinacje($n, $combine.$i, $i, $out);
  6. }
  7.  
  8. return $out;
  9. }
  10.  
  11. print_r(kombinacje(4));


Ten post edytował Greg0 10.02.2014, 00:47:03
Go to the top of the page
+Quote Post
radiopraca
post
Post #9





Grupa: Zarejestrowani
Postów: 14
Pomógł: 1
Dołączył: 7.02.2014

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


Dzięki. Trochę wczoraj nad tym siedziałem bo nie dało mi to spokoju i zrobiłem tak (też działa):

  1. function xxx($amount, $unit = 1, $part = array(), &$out = array()) {
  2. if ($amount >= $unit) {
  3. for ($i = $unit; $i <= $amount; ++$i) {
  4. $partial = array_merge($part, array($i));
  5. $out[] = $partial;
  6.  
  7. xxx($amount, $i + 1, $partial, $out);
  8. }
  9. }
  10.  
  11. return $out;
  12. }
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 Aktualny czas: 19.08.2025 - 19:26