我编写了一个二分搜索算法,并尝试在不同的编辑器(即 pycharm、github、jupiter notebook)上运行它。并且所有这些都没有显示任何输出。我的代码有问题吗?
def b_search(num):
numlist = [12, 23, 34, 54, 67, 81, 99, 102]
s = 0
e = len(numlist) - 1
m = round((s+e)/2)
n = 1
found = False
while (found == False) or ( n != 0):
if num == numlist[m]
found = True
elif num > numlist[m]:
if m ==s or m==e:
n=0
else:
s = round(m+1)
m = round((s+e)/2)
elif num < numlist[m]:
if m==s or m==e:
n=0
else:
e = round(m-1)
m = round((s+e)/2)
if n=0:
return -1
else:
return m
print(b_search(23))
我热衷于发现任何逻辑或语法问题。
你不应该四舍五入 s 和 e,你只处理 整数,所以没有必要。
修复了识别和逻辑错误
虽然你不希望它被优化,但当我修复你的代码时 总是返回-1。
添加了检查以查看搜索范围是否已用尽(s 变为 大于 e)。如果发生这种情况,则意味着目标数量未达到 在列表中,我们将 n 设置为 0 以退出循环。
将 m 的计算移至循环内部以更新中间 索引正确。
在 if num == numlist[m] 和 if num > 末尾添加了冒号 numlist[m] 行来纠正语法。
将 if n=0: 更改为 if n == 0: 以更正比较语法。 (正如 Sembei Norimaki 指出的那样)
将 while (found == False) 或 (n != 0): 更改为 while (found == False) 和 (n != 0):确保仅当两者都满足时循环才继续 条件为真。如果 n = 0 我们想退出循环,并且如果我们 找到我们也想要的号码然后退出。
def b_search(num):
numlist = [12, 23, 34, 54, 67, 81, 99, 102]
s = 0
e = len(numlist) - 1
n = 1
found = False
while (found == False) and (n != 0):
m = round((s + e) / 2)
if num == numlist[m]:
found = True
elif num > numlist[m]:
s = m + 1 # Update s directly without rounding
else: # num < numlist[m] (if it isn't >, certainly is =<)
e = m - 1 # Update e directly without rounding
if s > e: # Check if the search range is exhausted
n = 0
if n == 0:
return -1
else:
return m
print(b_search(23)) #outputs 1
print(b_search(99)) #outputs 6
print(b_search(100)) #outputs -1
print(b_search(12)) #outputs 0
print(b_search(102)) #outputs 7
print(b_search(54)) #outputs 3
print(b_search(81)) #outputs 5