在python中实现二进制搜索算法

时间:2017-09-21 11:19:08

标签: python recursion binary-search

我是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,这是我面临的问题。

2 个答案:

答案 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)