我正在尝试实施二分搜索;它采用有序列表,取中间值,将其与目标值进行比较,然后将子列表置于中间值之上或之下,直到找到目标或从列表中丢失目标。但是,出于某种原因,除非中点是目标,否则我总是会返回“无”。我不确定出了什么问题。
def bisect(list,target):
print list
split= list[len(list)//2]
print "Split value : " + str(split)
if target==split:
return "target"
elif target<split:
bisect(list[:split],target)
elif target>split:
bisect(list[(split):],target)
a= [1,2,3,4,5,6,7,8,9,10]
print bisect(a,2)
Output:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Split value : 6
[1, 2, 3, 4, 5, 6]
Split value : 4
[1, 2, 3, 4]
Split value : 3
[1, 2, 3]
Split value : 2
None
看起来拆分和目标值之间的最后一次比较没有发生?
答案 0 :(得分:4)
两个问题:
当您通过致电bisect
递交电话时,您仍需要通过执行return bisect(list[:split],target)
返回电话号码。
split
是list
的元素,而不是索引,因此list[:split]
不会按照您的想法行事。请改用list[:len(list)//2]
,同样将list[split:]
更改为list[len(list)//2:]
。