Python - 自制的二进制搜索功能不起作用

时间:2014-11-14 22:48:48

标签: python search binary

我已经学习python大约一个星期了,我尝试创建二进制搜索功能:

def bin_srch(a, b, c, d):
    l_c = map(int, c.split(" "))
    l_d = map(int, d.split(" "))
    for n in l_d:
        if n <= l_c[a/2]:
            for j in l_c[0:(a/2)+1]:
                if j == n:
                    print l_c.index(j)+1,
                elif n not in l_c[0:(a/2)+1]:
                    print -1,

        elif n > l_c[a/2]:
            for j in l_c[a/2:a]:
                if j == n:
                    print l_c.index(j)+1,
                elif n not in l_c[a/2:a]:
                    print -1,

但是,当我用一些输入测试函数时:

bin_srch(5,6,
"10 30 50 60 70",
"60 10 50 10 5")

产生4 1 3 1 -1 -1 -1而不是4 1 3 1 -1。任何人都能解释一下吗?

1 个答案:

答案 0 :(得分:0)

虽然我不太了解你的代码应该做什么,但我很确定我知道这个问题:

for j in l_c[0:(a/2)+1]:
    if j == n:
        print l_c.index(j)+1,
    elif n not in l_c[0:(a/2)+1]:
        print -1,

因此,对于每个值,如果匹配,则打印匹配(并继续查看);否则,请检查您已经循环的相同值(并将继续循环),如果找不到,请打印-1。因此,如果某些内容不匹配,您将多次打印-1

你可能想要的是:

for j in l_c[0:(a/2)+1]:
    if j == n:
        print l_c.index(j)+1,
        break
else:
    print -1,

至少这为此示例提供了所需的输出。为什么?

嗯,break意味着一旦找到匹配,就会停止通过内循环。 else - 注意它已附加到for,而不是if - 如果您完成循环而没有break - 则会运行。因此,不是每次都检查一次匹配并打印-1,而是只检查一次匹配3次并在最后打印-1,如果你从未找到过。{/ p>

(实际上,看起来你可以用list.index电话取代整个循环,但我会把它留给你。)

当然,您必须在顶级elif的{​​{1}}分支中进行相同的修复,因为您遇到了同样的问题。

另外,作为附注,如果您写if,则不需要if n <= l_c[a/2]:只需使用elif n > l_c[a/2]:;你已经知道else或者你不会来到这里是不正确的,因此n <= l_c[a/2]必须如此,所以你不需要检查它