二进制搜索程序没有按预期工作。出了什么问题?

时间:2017-05-13 06:16:17

标签: algorithm python-3.x binary-search

我正在获得价值"没有"在我的节目中?我哪里出错?

lis2 = [1, 3, 6, 2, 5, 4, 8, 12]
lis2 = sorted(lis2)
start = 0
end = len(lis2)
mid = (start+end)/2

def binary_search(i):
    global mid,start,end
    if i==lis2[mid]:
        return "Found"
    elif i<lis2[mid]:
        end = mid-1
        mid = (start+end)/2
    elif i>lis2[mid]:
        start = mid+1
        mid = (start+end)/2
    else:
        return "Not Found"

    binary_search(i)


print(binary_search(6))

感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

存在三个错误 -

  • 首先在评论中提及您写的答案之一 - binary_search(i)而不是return binary_search(i)
  • 其次是逻辑错误。如果列表中不存在元素,则代码将进入无限循环。为了避免这种检查start > end,如果发生ti,则元素不存在。
  • 第三次将end初始化为len(lis2),如果您尝试搜索列表中不存在且大于最大元素的元素,则会给IndexError: list index out of range清单(比如23)。因此,将end = len(lis2)更改为end = len(lis2)-1

正确代码 -

lis2 = [1, 3, 6, 2, 5, 4, 8, 12]
lis2 = sorted(lis2)
start = 0
end = len(lis2)-1
mid = int((start+end)/2)

def binary_search(i):
     global mid,start,end
     if(start>end):
        return "Not Found"
     if i==lis2[mid]:
        return "Found"
     elif i<lis2[mid]:
        end = mid-1
        mid = int((start+end)/2)
     elif i>lis2[mid]:
         start = mid+1
         mid = int((start+end)/2)
     return binary_search(i)

print(binary_search(6))

答案 1 :(得分:0)

在函数结束时,需要在调用函数recursivley时返回结果:

def binary_search(i):
global mid,start,end
if i==lis2[mid]:
    return "Found"
elif i<lis2[mid]:
    end = mid-1
    mid = (start+end)/2
elif i>lis2[mid]:
    start = mid+1
    mid = (start+end)/2
else:
    return "Not Found"

return binary_search(i) # <----- EDITED