Python 使用分治技术的二进制搜索

Python 使用分治技术的二进制搜索,python,binary-search,divide-and-conquer,Python,Binary Search,Divide And Conquer,算法正在工作,但只能找到值是否存在。 我想找到索引,以防它存在。我怎么做 def binarySearch(arr, num): if len(arr) == 1: #base case if arr[0] == num: return arr[0] #found else: return None #not found mid = int(len(arr)/2) if arr[mid] > num: return binar

算法正在工作,但只能找到值是否存在。 我想找到索引,以防它存在。我怎么做

def binarySearch(arr, num):
  if len(arr) == 1: #base case
    if arr[0] == num:
      return arr[0] #found
    else:
      return None #not found

  mid = int(len(arr)/2) 
  if arr[mid] > num:
    return binarySearch(arr[:mid], num)
  else:
    return binarySearch(arr[mid:], num)

print(binarySearch([1,2,3,4], 7)) #None
print(binarySearch([1,2,3,4], 3)) #3
print(binarySearch([1,2,3,4], 4)) #4
print(binarySearch([1], 2)) #None
print(binarySearch([1,2], 2)) #2

只需按如下方式传递索引:

def binarySearch(arr, num, idx=0):
  if len(arr) == 1: #base case
    if arr[0] == num:
      return idx
    else:
      return None #not found

  mid = len(arr) // 2
  if arr[mid] > num:
    return binarySearch(arr[:mid], num, idx)
  else:
    return binarySearch(arr[mid:], num, idx + mid)

print(binarySearch([1,2,3,4], 7)) #None
print(binarySearch([1,2,3,4], 3)) #2
print(binarySearch([1,2,3,4], 4)) #3
print(binarySearch([1], 2)) #None
print(binarySearch([1,2], 2)) #1
现在,如果已找到该数字,则返回该数字的索引;如果该数字不在列表中,则返回
None


<注释>中提到的:考虑传递开始和结束值,而不是在每个递归中复制列表。写和读的速度更快,更容易。

绕过索引。不要将切片数组传递到递归中,而应该考虑传递起始指针和结束指针。