2012-03-29 4 views
2

Пожалуйста, посмотрите на этот код:бинарный поиск в питона странное поведение

def chop(array, search): 
     lo = 0 
     high = len(array) - 1 
     while lo <= high: 
       mid = (high + lo) /2 
       if array[mid] == search: 
         return 'true' 
       elif search > array[mid]: 
         low = mid + 1 
       else: 
         high = mid - 1 
     return 'false' 



if __name__ == '__main__': 
     a = [1,2,3,4,5,6,7,8,9,10] 
     print chop(a, 3) 

я написал небольшой скрипт, который, как предполагается, для поиска числа в массиве - регулярный бинарный поиск. Поэтому я запускаю скрипт, и, например, когда я помещаю chop(a, 1), я получаю истинное значение, когда я помещаю chop(a, 2). Я получаю истинное значение, но когда я помещаю chop(a, 3), я не получаю ответ, просто пустую строку в оболочке Python.

Есть ли у кого-нибудь идеи о том, что происходит?

+6

'' true'' и '' false''? Как насчет ['True' и' False'] (http://docs.python.org/library/stdtypes.html#boolean-values)? – huon

+0

Ваш двоичный поиск останавливается при середине = 1. Попробуйте напечатать значение середины в вашем цикле. –

+2

Существует аналогичная функция в модуле bisect –

ответ

12

Я предполагаю, что это ваша ошибка:

low = mid + 1 

Ваш цикл, а использует переменную lo, и вы определяете новую переменную с именем low в пределах вашего цикла. По сути, вы никогда не обновляете свою переменную lo.

Изменение этой строки:

lo = mid + 1 

и ваш алгоритм должен работать.

+0

Вот и все. Не могу поверить, что я этого не замечал! Спасибо –

+2

Случается к лучшему из нас :) Не волнует –

+0

А, вот почему мне не нравятся заявления python. Легко пропустить. – nawfal

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