Страницы

Поиск по вопросам

пятница, 8 февраля 2019 г.

Как из алгоритма в итерационном виде сделать рекурсивный

Есть такой алгоритм для поиска первого вхождения числа с помощью бинарного поиска.
int lower_bound(const vector &mas, const int &value) { int l = 0, r = mas.size() - 1; while (l < r) { int m = l + (r - l)/2; if (mas[m] >= value) r = m; else l = m + 1; } return mas[l] == value ? l : -1; }
Как его можно записать с помощью рекурсии?


Ответ

Вначале пара замечаний по коду
Никогда не создавайте переменных с именем l. Они неотличимы от 1 и сильно понижают читабельность кода Для двоичного поиска переменная m должна вычисляться по формуле
m = (left + right) / 2
поиск потому и "двоичный", что отрезок делится на равные части
А теперь код
int lower_bound_r(const vector &mas, const int &value, int left, int right) { if (left >= right) return mas[left] == value ? l : -1; int m = (left + right) / 2; if (mas[m] >= value) right = m; else left = m + 1; return lower_bound_r(mas, value, left, right); }
int lower_bound(const vector &mas, const int &value) { return lower_bound_r(mas, value, 0, mas.size() - 1); }

Комментариев нет:

Отправить комментарий