2014-12-16 3 views
1

Прежде всего, извините, мой английский, это не мой родной язык.моя функция бинарного поиска не работает должным образом

Привет всем, у меня проблема с функцией бинарного поиска. Мне нужно сделать рекурсивную функцию (с использованием языка C) двоичного поиска, с помощью логического типа, вот это:

bool binary_search(int x, int array[], int m, int n){ 
    int middle=(m+n)/2; 
    if(m>n) return(0); 
    else if(x == array[middle]) return(1); 
    else if(x < array[middle]) return(binary_search(x, array, m, middle-1)); 
    else return(binary_search(x, array, middle+1, n)); 
} 

здесь вызов в главной функции:

printf("type the element to search: \n"); scanf("%d", &x); 
if(binary_search(x, A, 0,dim-1)) printf("Found!\n"); 
else printf("Not found!\n"); 

Проблема is, он всегда возвращает «не найден», даже если элемент не находится в массиве. Я попытался изменить логику внутри команды if, но просто сделал все результаты «найденными». Если кто-то может помочь, я буду рад.

ОБНОВЛЕНИЕ: Я изменил «=» проблемы, но выход все-таки не так, я напечатал вывод функции, и это всегда равна нулю

+3

Этот 'x = массив [средний]' явно не то, что вы хотите. Вам может понадобиться 'x == array [средний]' –

ответ

0

я основал ошибку:

Я генерировать случайные числа в функции («random_numbers()»), и «тусклым» переменная внутри этой функции, поэтому, тусклый внутри основной() равно 0 так что возвращаемое значение поиска всегда будет 0. Я чувствую себя немного глупо, но спасибо всем за помощь. Извините, новичок.

4

Следующая строка имеет серьезную проблему:

else if(x = array[middle]) return(1); 

Вместо сравнения x с array[middle], вы назначаете значение array[middle] на x. Если это значение отличное от нуля, оно всегда будет равно true, поэтому ваша функция всегда будет возвращаться в этот момент. Вы должны использовать ==, который сравнивается для равенства, а не =, что означает назначение.

Это очень распространенная ошибка среди начинающих программистов на C, поэтому вы можете задаться вопросом, почему A = B является даже выражением вообще в C, а не как оператор, как в Python. Обоснование (ex post facto?) Состоит в том, что иногда очень удобно иметь возможность назначать переменную внутри выражения. Рассмотрите:

char *error; 
if ((error = do_something()) != NULL) { 
    printf("error: %s\n", error); 
    // ... 
} 
2

Вы используете назначение =, а не тест для равенства ==. Получающееся выражение, вероятно, не равно нулю, поэтому значение if равно true.

0

Хорошо, проверили ли у вас отсортированный массив в качестве входа в функцию бинарного поиска? если он не использует бинарный поиск, он не даст вам правильного ответа.

Смежные вопросы