Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Znajdywanie elementu w tablicy poprzez rekurencja
gcdreak
post
Post #1





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

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


Witam!
Stworzyłem funckje, która sprawdza, czy podana wartość występuje w tablicy.
  1. <?php
  2. function ifInArray($array,$x, $left, $right){
  3.        if($left > $right){
  4.            return false;
  5.        }else{
  6.            if($array[$left] == $x)
  7.                return true;
  8.            else
  9.                ifInArray($array,$x,$left + 1, $right);
  10.        }
  11.    }
  12.    
  13.    $i = 0;
  14.    do{
  15.        $array[] = mt_rand(-10,10);
  16.        $i++;
  17.    } while ($i < 10);    
  18.    
  19.    $x = 5;
  20.    
  21.    $left = min($array);
  22.    
  23.    $right = max($array);
  24.  
  25.    echo 'Szukana liczba to: '.$x.'<br />';
  26.    echo 'Tablica wygląda tak:<pre>';
  27.    print_r($array);
  28.    echo '</pre>';
  29.    
  30.    ifInArray($array,$x, $left, $right) ? $result ='Szukana wartość znajduje się w tablicy.' : $result = 'Wartość nie występuje w tablicy.';
  31.    echo $result;
  32. ?>

Nie wiem jednak dlaczego ciągle zwraca false?
Co jest nie tak?

Ps: To tylko w celu treningu. Wiem, że istnieją do tego specjalne funkcje;P
Powód edycji: Poprawiłem bbCode (ociu)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
kipero
post
Post #2





Grupa: Zarejestrowani
Postów: 233
Pomógł: 50
Dołączył: 28.10.2006
Skąd: Radom

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


Chyba powinno być tak:
  1. <?php
  2. function ifInArray($array,$x, $left, $right){
  3.        if($left > $right){
  4.            return false;
  5.        }else{
  6.            if($array[$left] == $x)
  7.                return true;
  8.            else
  9.                return ifInArray($array,$x,$left + 1, $right);
  10.        }
  11.    }
  12. ?>

Zapomniałeś o return w 10 linijce i w Twoim przypadku funkcja zwracała wartość tylko, gdy szukany element był na pierwszym miejscu.
Poza tym:
  1. <?php
  2. $left = min($array);
  3. $right = max($array);
  4. ?>

Zastąp:
  1. <?php
  2. $left = 0;
  3. $right = (count($array) - 1);
  4. ?>

Funkcje min i max nie zwracają minimalnego i maksymalnego indeksu, tylko wartość.
Ponadto można tę funkcję napisać nie używając zmiennych $left i $right, ale skoro się uparłeś.

Ten post edytował kipero 8.07.2009, 15:33:12
Go to the top of the page
+Quote Post
erix
post
Post #3





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A czemu wynajdujesz koło na nowo...? Przecież jest i in_array" title="Zobacz w manualu PHP" target="_manual, i array_slice" title="Zobacz w manualu PHP" target="_manual...

Cytat
Ps: To tylko w celu treningu. Wiem, że istnieją do tego specjalne funkcje;P

To nie wynajduj koła na nowo, nie marnuj czasu na coś, co zostało zrobione. Myśl nad projektem wieży, a nie budowie cegły, która i tak będzie prostopadłościanem.
Go to the top of the page
+Quote Post
gcdreak
post
Post #4





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

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


@kipero
Dzięki za znalezienie tego o czym zapomniałem.
Jeśli chodzi o drugą część dwojego postu to zwróć uwagę na to, żę moja tablica nie zawiera kolejnych(wylosowane 10 z pośród 20) wartości i dlatego min() i max() zostały przezemnie urzyte.
@erix
Nie marnuj czasu na zaprzeczanie tego co napisałem jako (s)twierdzenie tylko pomyśl dlaczego akurat robię coś takiego.

Cytat(erix @ 8.07.2009, 18:42:23 ) *
Myśl nad projektem wieży, a nie budowie cegły, która i tak będzie prostopadłościanem.

Fraza mi się podoba, mimo, że post bez sensu;P
Go to the top of the page
+Quote Post
kipero
post
Post #5





Grupa: Zarejestrowani
Postów: 233
Pomógł: 50
Dołączył: 28.10.2006
Skąd: Radom

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


Cytat(gcdreak @ 8.07.2009, 20:58:32 ) *
Jeśli chodzi o drugą część dwojego postu to zwróć uwagę na to, żę moja tablica nie zawiera kolejnych(wylosowane 10 z pośród 20) wartości i dlatego min() i max() zostały przezemnie urzyte.


Tylko, że używasz zmiennej $left jako indeksu tablicy w funkcji:
  1. <?php
  2. if($array[$left] == $x)
  3. ?>

Co jeśli najmniejsza wartość wynosi np. -7? Wtedy próbujesz się odwołać do $array[-7], a indeksy w tablicy zaczynają się od 0.
Go to the top of the page
+Quote Post
gcdreak
post
Post #6





Grupa: Zarejestrowani
Postów: 365
Pomógł: 8
Dołączył: 16.12.2008

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


Tak, ale nie powoduje to błędu tylko zwraca false i to działa.
Go to the top of the page
+Quote Post

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: 23.08.2025 - 10:37