Рекурсивный двоичный поиск на С++

169
25 апреля 2017, 08:38

День добрый. Реализовал рекурсивный двоичный поиск, но время от времени переполняется стек. В чем проблема?

int bin_search(vector<int> & arr, int left, int right, int number) {
    int mid = left / 2 + right / 2;
    if (left > right) {
        return -1;
    }
    if (left <= right) {
        if (number == arr[mid]) {
            return mid;
        }
        else if (number > arr[mid]) {
            bin_search(arr, mid + 1, right, number);
        }
        else {
            bin_search(arr, left, mid - 1, number);
        }
    }
}
Answer 1

Первое, то нашел - это следующая строка

int mid = left / 2 + right / 2;

она не всегда ищет "середину". допустим, что left и right равны 1, тогда mid будет равно 0. А это не совсем то, что ожидается. Если взять два других нечетных числа, то будет такая же ситуация или около того. Например, при 3 и 5, середина у Вас получается 3 (1 + 2)

при двух 1 эта строка скорее всего и приводит к зацикливанию.

Как избежать подобных ошибок? добавьте в список #include <cassert>, а в коде после данного вычисления добавьте такое

assert(mid >= left);
assert(right>=mid);

и ошибка сама всплывет.

READ ALSO
DataGridView WinForms, вопрос по оформлению

DataGridView WinForms, вопрос по оформлению

Уже облазил всю документацию (либо почти всю), стоит такой вопрос - как изменять размеры ячеек, не отдельно взятой а всех в dataGridView программно,...

234
Ошибка Cl.exe при постройке проекта

Ошибка Cl.exe при постройке проекта

Всем доброго вечераСобираю проект email [клиента] (http://www

287
&ldquo;Ошибка доступа для записи&rdquo;. В чём проблема?

“Ошибка доступа для записи”. В чём проблема?

Написал простую программу с ассемблерной вставкой, использующую циклическую конструкцию:

186
Собрать несколько бинарников cmake

Собрать несколько бинарников cmake

Имеется клиент-сервер проект, содержание cmakelist следующее:

245