前提:数组按升序排列,且要查找的元素在数组中。
二分查找:是一个递归函数 c.要检查的元素a是当前数组中值b。如果 b=a,则返回 b 的索引。如果b>a,则在b左侧的子数组中调用函数c。否则,将在 b 右侧的子数组中调用函数 c。
我第一次想到,按照上面的思路编程后的结果:
def binary_search(索引, a, 值): if a[(len(a) - 1) // 2] == 值: 返回索引 + (len(a) - 1) // 2 elif a[(len(a) - 1) // 2] < 值: return binary_search(index + (len(a) - 1) // 2 + 1, a[(len(a) - 1) // 2 + 1:], value) 别的: return binary_search(index, a[0:(len(a) - 1) // 2 + 1], value)
第二个思考,简化中位数计算逻辑:
def binary_search(索引, a, 值): 如果 a[len(a) // 2] == 值: 返回索引 + len(a) // 2 elif a[len(a) // 2] < 值: 返回binary_search(index + len(a) // 2, a[len(a) // 2:], value) 别的: 返回binary_search(index, a[0:len(a) // 2], value)
第三个想法,去掉return,改成lambda形式:
binary_search = lambda索引,a,值:index + len(a) // 2 if a[len(a) // 2] == value else binary_search(index + len(a) // 2, a[ len(a) // 2:], value) if a[len(a) // 2] < value else binary_search(index, a[0:len(a) // 2], value)