def bsearch(s, e, first, last):
print(first, last)
if (last - first) < 2:
return s[first] == e or s[last] == e
mid = first + (last - first) / 2
if s[mid] == e: return True
if s[mid] > e: return bsearch(s, e, first, mid - 1)
return bsearch(s, e, mid + 1, last)
def search1(s,e):
print(bsearch(s, e, 0, len(s)-1))
print('Search complete')
def testSearch():
s = range(0, 1000000)
input('binary,-1')
print(search1(s, -1))
它的二进制搜索算法。我有两个问题。
问题1:
为什么first
在下一行中是必要的?
mid = first + (last - first) / 2
问题2: 当我运行程序时,我无法运行结果。 错误消息是:
range indices must be integers or slices, not float.
我如何解决?
答案 0 :(得分:0)
从问题2开始:
错误消息&#34;范围索引必须是整数或切片,而不是浮点数&#34;告诉你,你正在尝试使用float而不是int来切片(获取类似列表的集合的一部分,例如使用some_list[5:]
)。更准确地说,mid
为5.0
,而不是5
。
在Python 3中,默认分区是浮动分区(与Python 2不同)。要获得整数除法,您需要使用双斜杠运算符:
mid = first + (last - first) // 2
关于问题1:mid是中间元素。它是获得中间元素的基本方程,但也许你感到困惑,因为你期望另一个等价方程;它可以计算为
mid = first + (last - first) // 2
或:
mid = (first + last) // 2
如果您使用的是在每次递归调用时创建列表s
的副本的实现,则等式可能会有所不同。您提供的实施工作&#34;就地&#34;所以它需要绝对坐标。
编辑:正如@philipxy在评论中指出的那样,您可以轻松找到导致切片相关错误的原因,搜索您的错误消息+&#34; division&#34;。
我刚刚对此进行了测试,并将第一个Google结果指向TypeError: list indices must be integers, not float;因为这与您的问题(二进制搜索)完全相同,如果不是您在此处包含的第二个问题,则可以将此问题标记为重复并关闭。事实上,一些更有经验的用户仍然可以决定将其标记为重复。