我一直在尝试执行此代码,其工作是使用二进制搜索来查找特定元素。现在,如果列表中存在元素,则代码可以正常工作,但如果不包含搜索元素,则无法显示预期的块目前。我假设该列表按升序排列。对此将有所帮助
我尝试用while赋予其他部分:但这没有帮助。它无法显示找不到元素的错误
def binarysearch(l,item):
low=0
u=len(l)-1
while low<=u:
mid=int((low+u)/2)
if item==l[mid]:
return mid
elif item<l[mid]:
high=mid-1
else:
low=mid+1
l=eval(input("Enter the list of elements"))
item=int(input("Enter search item:"))
index=binarysearch(l,item)
if index>=0:
print(item,"found at index",index)
else:
print("Element not found") #i am unable to reach this part
如果输入为: 输入元素列表[8,12,19,23] 输入搜索项:10
我希望结果是“找不到元素”。但是在这种情况下程序什么也不做
答案 0 :(得分:0)
我会给你一个提示,稍后我将更好地测试此代码并尝试解释它为什么发生。
提示是使用in
检查列表中是否存在项目。 In
比使用循环更具表现力。
示例工作:
def binarysearch(elem, item):
if item in elem:
return elem.index(item)
else:
return -1 # because your if verifying if the return is equal or greater than 0.
更新1
当我尝试运行您的代码时,我陷入了一个无限循环,这是由于表达式mid=int((low+u)/2)
导致的-我不明白您为什么这样做。如果我们运行此代码,则会发生以下情况:
u=len(l)-1
u = 3,因为4-1 while
,因为条件为True mid=int((low+u)/2)
,此处mid
将为(0 + 3)/ 2,因为您将其强制为int,结果将为1 if item==l[mid]:
10 == 12-l [mid]-l [1]-错误elif item<l[mid]:
10 <12是high=mid-1
高将是1-1 = 0 low
,如果item
不是该位置的值==则增加。因此您可以使用while
,但可以这样:def binarysearch(l,item):
low=0
u=len(l)-1
while low<=u:
if item==l[low]:
return low
else:
low+=1
return -1
l=eval(input("Enter the list of elements"))
item=int(input("Enter search item:"))
index=binarysearch(l,item)
if index>=0:
print(item,"found at index",index)
else:
print("Element not found")
要调试代码,您可以使用[1]:https://docs.python.org/3/library/pdb.html