Изучение двоичного поиска в Python 3.7

Я нашел этот код на https://www.geeksforgeeks.org/binary-search/

# Python Program for recursive binary search.

# Returns index of x in arr if present, else -1
def binarySearch (arr, l, r, x):

    # Check base case
    if r >= l:

        mid = l + (r - l)/2;

    # If element is present at the middle itself
    if arr[mid] == x:
        return mid

    # If element is smaller than mid, then it 
    # can only be present in left subarray
    elif arr[mid] > x:
        return binarySearch(arr, l, mid-1, x)

    # Else the element can only be present 
    # in right subarray
    else:
        return binarySearch(arr, mid+1, r, x)

    else:
        # Element is not present in the array
        return -1

# Test array
arr = [ 2, 3, 4, 10, 40, 50, 80, 140, 200, 2000, 100]
x = 50

# Function call
result = binarySearch(arr, 0, len(arr)-1, int)

if result != -1:
    print ("Element is present at index %d" % result)
else:
    print ("Element is not present in array")

Однако, когда я запускаю его, я получаю следующую проблему: TypeError: индексы списка должны быть целыми числами или срезами, а не с плавающей точкой. Я не уверен, как это преобразовать. Я попытался установить весь массив как int, но это не сработало, или заменить x на int, и это тоже не сработало.

Любое предложение?


person Dre    schedule 11.08.2018    source источник
comment
l + (r - l)/2 является плавающим. Попробуйте округлить его.   -  person Sianur    schedule 11.08.2018
comment
Хорошо, позволь мне попробовать. Спасибо. Только что попробовал. Я получаю сообщение об ошибке: TypeError: '›' не поддерживается между экземплярами 'int' и 'type'   -  person Dre    schedule 11.08.2018


Ответы (1)


Проблема в этой строке:

mid = l + (r - l)/2;

В Python 3 / выполняет деление с плавающей запятой, а поскольку mid используется в качестве индекса массива, он должен быть int. Для целочисленного деления используйте //

mid = l + (r - l) // 2;

Есть еще одна проблема с вызовом функции:

result = binarySearch(arr, 0, len(arr) - 1, int)

Последний параметр должен быть не int, а x (переменная, которую вы ищете):

result = binarySearch(arr, 0, len(arr) - 1, x)

когда вы передадите int в качестве последнего параметра, вы получите ошибку TypeError: unorderable types: int ()> type ()

person jpw    schedule 11.08.2018
comment
Хорошо, я внес эти изменения, и теперь это работает. Большое спасибо. - person Dre; 11.08.2018