【问题标题】:Python - home-made binary search function not workingPython - 自制的二进制搜索功能不起作用
【发布时间】:2015-01-12 10:39:02
【问题描述】:

我已经学习 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。有人可以解释一下吗?

【问题讨论】:

  • 请重命名您的参数/变量以获得更具描述性的名称
  • 这个函数到底应该做什么?为什么结果应该是4 1 3 1 -1

标签: python search binary


【解决方案1】:

虽然我不太明白你的代码应该做什么,但我很确定我知道问题所在:

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-ing 的情况下完成循环就会运行。因此,您不必检查匹配 3 次并每次打印 -1,而只需检查匹配 3 次并在最后打印 -1(如果您从未找到)。

(实际上,您似乎可以将整个循环替换为 list.index 调用,但我将由您决定。)

当然,您必须在顶级 ifelif 分支中进行相同的修复,因为您在那里遇到了同样的问题。

另外,作为旁注,如果您写if n &lt;= l_c[a/2]:,则不需要elif n &gt; l_c[a/2]:,只需使用else;你已经知道n &lt;= l_c[a/2]不是真的或者你不会到这里,所以n &lt; l_c[a/2]一定是真的,所以你不需要检查它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    相关资源
    最近更新 更多