import math
def BinarySearch( A , val , low , high ):
if high < low :
return -1 #not found
mid = low + (high - low ) /2
if A[mid] > val:
return BinarySearch(A,val , low , high )
if A[mid] < val :
return BinarySearch(A,val,low,high)
else:
return mid #found
A = [ 12 , 23 , 2 , 33 , 123 , 4 , 5 , 2 , 54 , 555 , 21 ]
BinarySearch( A , 0 , 0, 10)
我试图在不使用bisect模块的情况下进行二进制搜索。但它给出了一个错误,例如这个
File "doubtrob.py", line 8, in BinarySearch
return BinarySearch(A,val , low , high )
RuntimeError: maximum recursion depth exceeded
答案 0 :(得分:4)
def BinarySearch( A , val , low , high ):
if high < low :
return -1 #not found
mid = low + (high - low ) /2
if A[mid] > val:
return BinarySearch(A, val , low , mid-1 )
if A[mid] < val :
return BinarySearch(A, val, mid+1 ,high)
else:
return mid #found
递归必须有一个终点。你一直在调用相同的参数,因此永远不会满足high<low
,所以永远不会terminates
。
答案 1 :(得分:1)
您在每次迭代时使用完全相同的搜索空间。此外,你需要在高 - 低&lt; 2,否则mid最终会等于低,你可能仍然陷入无限循环。
另外,您可以更简单地mid
获得(low + high)/2
。
答案 2 :(得分:1)
提示:在2返回的BinarySearch()调用中,你继续使用相同的参数调用它,所以它会在下一次调用时保持循环到同一个位置,这会一直调用相同的参数......
这确实是一个功课问题。提示结束。