D
D
Dreaded2017-10-14 14:18:54
C++ / C#
Dreaded, 2017-10-14 14:18:54

Implementing recursive binary search on an array in C?

I am taking a CS50 course, the task is to implement a recursive binary search in an ordered array in SI
. According to the terms of the task, the function declaration cannot be changed. That is, the prototype should look exactly like this:
bool search(int value, int values[], int n)
where value is the desired value, int values[] is the array of values, int n is the number of elements in the array
Here is the code I wrote. If the desired number falls in the middle of the array, everything is fine. But if the number is on the right or left of the middle, the function returns false :(
What am I doing wrong?

bool search(int value, int values[], int n)
{
    //проверим количество элементов в массиве
    if (n <= 0)
        return false;
    //Находим "середину массива"
    int middle=n/2;
    //Проверяем, вдруг искомое значение попало на середину. На этом этапе всё работает.
    if (value==values[middle-1])
        return true;
    //Проверяем справа, или слева находится искомое значение. Вот тут я делаю что то неправильно :(
    else if (value > values[middle-1])
         //если значение справа - передаем в функцию адрес элемента следующего за middle,
        // и вычитаем из общего количества элементов те, что остались слева
        search(value, & values[middle+1], n-middle);  

    else if (value < values[middle-1])
         // если значение слева, то передаем в функцию массив с самого начала, 
        //но количество элементов ограничиваем лишь теми, что остались слева.
        search(value, values, middle-1); 
   else return false;

}

Answer the question

In order to leave comments, you need to log in

2 answer(s)
G
Georgy Pelageykin, 2017-10-14
@Dreaded

I'm modifying devalone 's answer a bit , because it seems to have a small error with the array size in the second call:

bool search(int value, int values[], int n)
{
  //проверим количество элементов в массиве
  if (n <= 0)
    return false;

  //Находим "середину массива"
  int middle = n/2;
  if (value > values[middle])
    return search(value, values + middle + 1, n - middle - 1);
  else if (value < values[middle])
    return search(value, values, middle);

  return true;
}

D
devalone, 2017-10-14
@devalone

bool search(int value, int values[], int n)
{
    //проверим количество элементов в массиве
    if (n <= 0)
        return false;
        
    //Находим "середину массива"
    int middle=n/2;
    if (value > values[middle])
        return search(value, &values[middle + 1], n - middle - 1);
    else if (value < values[middle])
        return search(value, values, middle);

    return true;
}

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question