@Dreaded

Реализация рекурсивного бинарного поиска в массиве на СИ?

Прохожу курс CS50 , задача стоит реализовать рекурсивный бинарный поиск в упорядоченном массиве на СИ
По условиям задачи, декларацию функции менять нельзя. То есть прототип должен выглядеть именно так:

bool search(int value, int values[], int n)

где value - искомое значение, int values[] - массив значений, int n - количество элементов в массиве

Вот написанный мной код. Если искомое число попадает на середину массива - всё отлично находится. Но в случае если число справа или слева середины - функция возвращает false :(
Что я делаю не так?
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;

}
  • Вопрос задан
  • 5226 просмотров
Решения вопроса 1
Немного модифицирую ответ 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;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
devalone
@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;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы