2015-10-27 4 views
0

Я создал двоичный поиск, но я застрял в проблеме. Всякий раз, когда я запускаю main(), я просто получаю None, когда ключ равен 8, 5, 2 и 1. Я также пытаюсь вернуть bsearch индекс значения key_point в integer_list, но вместо этого он просто возвращает key_point. Если кто-то может сообщить мне, что происходит, я был бы признателен.Python повторный выход из программы

def bsearch(integer_list, key_point, start, end): 
    midpoint = (start + end) // 2 
    if start >= end: 
     return None 
    elif integer_list[midpoint] == key_point: 
     return key_point 
    elif integer_list[midpoint] > key_point: 
     return bsearch(integer_list, key_point, start, (midpoint - 1)) 
    elif integer_list[midpoint] < key_point: 
     return bsearch(integer_list, key_point, (midpoint + 1), end) 


def main(): 
    integer_list = [x + 1 for x in range(0, 10)] 
    key = 11 
    p = len(integer_list) - 1 
    start = integer_list[0] 
    end = integer_list[p] 
    while key >= 1: 
     bsearch(integer_list, key, start, end) 
     print(bsearch(integer_list, key, start, end)) 
     key = key - 1 
+0

Я понимаю, что вы могли бы делать практику алгоритма - но если вы _aren't_, питон уже поставляет бинарные алгоритмы поиска в 'bisect'. – mgilson

+1

Почему ваш старт и конец равны первому и последнему значению списка? Он должен быть первым и последним индексом массива, в этом случае 0 и 9 –

+0

Если вы не хотите вернуть None, тогда не программируйте его. If start> = end: return None. Верните что-то еще, даже если вам нужно добавить предыдущую временную переменную результата. –

ответ

2

У вас есть следующие ошибки:

1) Вызов binary_search из main содержит start = 1 and конец = 10 which should have been старт = 0 и end = 9 (значение индексов) .Мы найти все средние точки согласно индексы.

2) Просто проверьте start > end, потому что start == end абсолютно прав, и все случаи, когда вы получили None, были все из-за этого случая. Все случаи, когда вы вернулись из-за этого условия, были на самом деле в том случае, когда integer_list[midpoint] == key_point сохранено.

Вот исправленный код:

def bsearch(integer_list, key_point, start, end): 
    midpoint = (start + end) // 2 
    if start > end: 
     return None 
    elif integer_list[midpoint] == key_point: 
     return key_point 
    elif integer_list[midpoint] > key_point: 
     return bsearch(integer_list, key_point, start, (midpoint - 1)) 
    elif integer_list[midpoint] < key_point: 
     return bsearch(integer_list, key_point, (midpoint + 1), end) 


def main(): 
    integer_list = [x + 1 for x in range(0, 10)] 
    key = 11 
    p = len(integer_list) - 1 
    start = integer_list[0] 
    end = integer_list[p] 
    while key >= 1: 
     print(bsearch(integer_list, key, 0, p)) 
     key = key - 1 
main()  

Надежда, что помогает :)

+0

start = integer_list [0] неверно. Он работает для этого примера, потому что integer_list [0] равен 1, но для другого случая он не работает. Начало всегда должно быть 0 –

+0

@SamyArous Да, вы правы. Я очень сожалею об этой ошибке. Отредактировал его. Благодарю. –

1

Вы смешиваете индексы и значения несколько раз в своем алгоритме. Ваш базовый/найденный случай должен возвращать среднюю точку, так как это место, где вы его нашли, но вы возвращаете key_point, значение, которое вы на самом деле ищете.

И снова, когда вы настраиваете свой цикл, вы устанавливаете свои начальные и конечные значения как содержимое списка в начале и в конце, вместо индекса начала и окончания. Некоторые из этих ошибок станут более заметными, если для вашего test_list вы используете набор чисел, который не является только последовательным числом 1-11. Прямо сейчас это просто происходит.

1

Прежде всего, вы передаете значение функции вместо индексов:

start = 0 
end = len(integer_list) - 1 

Во-вторых вам нужно, чтобы вернуться None, когда оба начала и конца поменялись местами. не тогда, когда они равны

if start > end: 
     return None 

В-третьих, зачем вы возвращаете значение, которое ищете? в этом нет никакого смысла. Вместо этого вы должны вернуть индекс элемента.

elif integer_list[midpoint] == key_point: 
     return mid_point 

Наконец, если вы хотите следовать, что почти каждый метод поиска возвращает, вы должны вернуть -1, если вы не можете найти значение, которое вы ищете, вместо None. Это избавит вас от головной боли.

if start > end: 
     return -1 
Смежные вопросы