使用递归的二进制搜索进入无限循环

时间:2016-12-22 12:58:49

标签: python recursion binary-search

我是python的新手,所以我不知道我是否遗漏了一些明显的东西(例如冒号或某个地方的某个时期)。

我试图使这个二进制搜索算法工作,但如果我传递一个大于3个元素的列表,程序将进入无限递归制动和python中的最大设置。

基本案例工作正常。

[]和[element1]列表通过。

[element1,element2,element3,...,element99]卡住了......

以下是代码:

{{1}}

感谢。

2 个答案:

答案 0 :(得分:1)

我们显然必须假设数据已经排序,否则二进制搜索是毫无意义的。首先,您错过了元素何时等于枢轴本身的情况:

if element == pylist[mid]:

此外,在此块中:

elif len(pylist) == 1 and pylist[0] == element:
    return True

你没有处理剩下一个元素并且你想要的元素的情况,在这种情况下你应该返回False。

以下是完全更正的代码:

def binsearch(pylist, element):
    pylist = sorted(pylist) # Just to be sure
    if len(pylist) == 0:
        return False    

    if len(pylist) == 1:
        if pylist[0] == element:
            return True
        else:
            return False
    else:
        mid = len(pylist) // 2
        if element == pylist[mid]:
            return True
        elif element > pylist[mid]:
            return binsearch(pylist[mid:], element)
        else:
            return binsearch(pylist[:mid], element)

肯定有空间使这段代码更有效率,但这只是纠正了代码。

答案 1 :(得分:0)

好的。必须使用冒泡排序功能来排序没有set()函数的随机列表。

def binsearch(pylist, element):
    if len(pylist) == 0:
        return False
    else:
        v_mid = len(pylist) // 2
        if pylist[v_mid] == element:
            return True
        else:
            if element > pylist[v_mid]:
                return binsearch(pylist[v_mid + 1:], element)
            else:
                return binsearch(pylist[:v_mid], element)