我已经学习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
。任何人都能解释一下吗?
答案 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]
必须如此,所以你不需要检查它