Python重复了程序的输出

时间:2015-10-27 18:59:57

标签: python recursion binary-search

我创建了一个二分搜索,但我遇到了问题。每当我运行main()时,当key等于8,5,2和1时,我只得到None。我也试图让bsearch返回integer_list中key_point值的索引,但它只返回key_point。如果有人能让我知道出了什么问题,我会很感激。

def bsearch(integer_list, key_point, start, end):
    midpoint = (start + end) // 2
    if start >= end:
        return None
    elif integer_list[midpoint] == key_point:
        return key_point
    elif integer_list[midpoint] > key_point:
        return bsearch(integer_list, key_point, start, (midpoint - 1))
    elif integer_list[midpoint] < key_point:
        return bsearch(integer_list, key_point, (midpoint + 1), end)


def main( ):
    integer_list = [x + 1 for x in range(0, 10)]
    key = 11
    p = len(integer_list) - 1
    start = integer_list[0]
    end = integer_list[p]
    while key >= 1:
        bsearch(integer_list, key, start, end)
        print(bsearch(integer_list, key, start, end))
        key = key - 1

3 个答案:

答案 0 :(得分:2)

您有以下错误:

1)binary_searchmain的调用包含start = 1 and end = 10 which should have been start = 0和end = 9(索引值).We根据指数找到所有中点。

2)只需检查start > end,因为start == end绝对正确,而None的情况都是由于这种情况造成的。由于这种情况而退回的所有情况实际上都是integer_list[midpoint] == key_point为真的情况。

以下是更正后的代码:

def bsearch(integer_list, key_point, start, end):
    midpoint = (start + end) // 2
    if start > end:
        return None
    elif integer_list[midpoint] == key_point:
        return key_point
    elif integer_list[midpoint] > key_point:
        return bsearch(integer_list, key_point, start, (midpoint - 1))
    elif integer_list[midpoint] < key_point:
        return bsearch(integer_list, key_point, (midpoint + 1), end)


def main():
    integer_list = [x + 1 for x in range(0, 10)]
    key = 11
    p = len(integer_list) - 1
    start = integer_list[0]
    end = integer_list[p]
    while key >= 1:
        print(bsearch(integer_list, key, 0, p))
        key = key - 1
main()       

希望有所帮助:)

答案 1 :(得分:1)

您在算法中多次混合索引和值。 你的基础/发现案例应该返回中点,因为那是你找到它的地方,但是你要返回key_point,而不是你实际搜索的值。

同样,当您设置循环时,您将开始和结束值设置为开头和结尾列表的内容,而不是开始和结束索引。如果对于test_list,您使用的一组数字不仅仅是序号1-11,那么其中一些错误会变得更加明显。现在它正好排队。

答案 2 :(得分:1)

首先,您将值传递给函数而不是索引:

start = 0
end = len(integer_list) - 1

其次,当开始和结束都反转时,你需要返回None。不是在他们平等时

if start > end:
        return None

第三,为什么要返回您要搜索的值?它没有任何意义。您应该返回元素的索引。

elif integer_list[midpoint] == key_point:
        return mid_point

最后,如果你想要遵循几乎所有搜索方法返回的内容,当你找不到你想要的值时,你应该返回-1,而不是None。这将为您省去一些麻烦。

if start > end:
        return -1