我是python的新手,我正在尝试通过递归实现二进制搜索,我可以看到互联网的解决方案,但我自己也尝试过,因为我想学习,所以这是我的方法:
y=7
count=0
def hello(x):
while len(x)>0:
for i in x:
a=len(x)//2
if y<x[a]:
print("left_most_side", a)
return hello(x[:a])
elif y==x[a]:
print("middle", a)
return a
elif y>x[a]:
print("right_most_side", a)
return hello(x[a:])
return x
hello([1,2,3,4,5,6,7])
它的工作完善并按预期提供输出,但问题是,它打印双截面列表的索引,而我需要原始列表的索引。例如:a = [1,2,3,4]它一分为二,现在[1,2]和[3,4]现在如果我必须找到4那么它将打印4位于0位置,答案是正确的但只有在二等分列表中,而正确的答案是&#34; 4&#34;在位置3的原始列表中,因此它应该打印3,这是我面临的问题。
答案 0 :(得分:1)
正如我的评论中所提到的,我建议传递整个列表,以及搜索的上限和下限。这将解决索引问题。
此外,请不要让您的函数使用全局变量。这是不好的做法。
def hello(x, key, l, r):
if l < r:
a = (l + r) // 2
if key < x[a]:
return hello(x, key, l, a + 1)
elif key > x[a]:
return hello(x, key, a + 1, r)
else:
return a
else:
return -1
In [288]: src = [1,2,3,4,5,6,7]
In [289]: hello(src, key=7, l=0, r=7)
Out[289]: 6
In [290]: hello(src, key=0, l=0, r=7)
Out[290]: -1
In [291]: hello(src, key=1, l=0, r=7)
Out[291]: 0
答案 1 :(得分:0)
使用向左和向右跟踪数组边界,因为它通过递归,如此
y=7
def hello (x, left, right, query):
if right >= left:
mid = left + (right - left)/2
if x[mid] == query:
return mid
elif x[mid] > query:
return hello(x, left, mid-1, query)
else:
return hello(x, mid+1, right, query)
else:
# we found nothing
return -1
arr = [1,2,3,4,5,6,7]
print hello(arr,0,len(arr),y)