Binary search-rekurencyjnie, przypadek gdy brak elementu w tablicy

0

Witam,
Napisałem funkcje rekurencyjną która binarnie przeszukuje tablicę liczb całkowitych, wszystko działa, oprócz przypadku, w którym poszukiwanego elementu nie ma w tablicy.
Zapewne jest to wina warunku który zawarłem w funkcji, ale nie jestem w stanie wymyślić co zrobiłem źle i jak to narawic

int binsearch(int tab[],int n,int lewy,int prawy,int szukana)
{
    int os=(lewy+prawy)/2;

    if( lewy==prawy && tab[lewy]!=szukana) return -1;
    if(szukana==tab[os]) return os;
    else if(szukana<tab[os]) return binsearch(tab,n,lewy,os,szukana);
    else if(szukana>tab[os]) return binsearch(tab,n,os,prawy,szukana);
    


}

1

Prawy nigdy nie będzie równy lewemu w Twojej funkcji. Zmień warunek na lewy == prawy -1 i sprawdz wartości dla obu indeksów :)

0

Off by one.
Lepiej sprawdź jak ten algorytm zachowa się dla tablicy dwuelementowej :). Policz sobie ile razy wywoła sie rekurencyjnie ta funkcja (dodaj printa po wywolaniu funkcji).

0

Możesz porównać zachowanie Twojego algoytmu z Rosetta Code .

0

Zaraz zaraz, a za rekurencyjne binary search to nie ma czasem ustawowej kary finansowej?

1

To jeszcze dodam:

  1. Naucz się wnioskować o swoim kodzie. Jakie warunki mają byś spełnione w jakim momencie. Kartka w dłoń i sprawdzasz. Ewentualnie w celach debugowych dodaj kod, który sprawdza te warunki podczas wykonania programu.
  2. Naucz się obsługiwać debugger.

A teraz do sedna sprawy, zobacz jaki jest łańcuch wywołań dla dwuelementowej tablicy:

binsearch(A, 2, 0, 1, v) ->
    binsearch(A, 2, 0, 0, v)
    binsearch(A, 2, 0, 1, v) ->
        binsearch(A, 2, 0, 0, v)
        binsearch(A, 2, 0, 1, v) -> ...

Widzisz nieskończoną rekurencję? Problem polega na tym, że skoro sprawdziłeś element pod indeksem os, to potem chcesz sprawdzić zakresy od [lewy, os) i (os, prawy]. Zauważ niedomknięty przedział. W przeciwnym wypadku, jeżeli os == lewy zapętlisz się.

1 użytkowników online, w tym zalogowanych: 0, gości: 1