二分法查找:必须有序列表
递归返回None的问题:由于递归函数是一层一层执行到结束条件后再原路返回,下面结束条件时有return,但是返回的时候前面几次递归时并没有return,比如递归顺序为f1-》f2-》f3,在f3的时候返回结果,但是f1和f2没有返回,所以整个函数返回None
def finx_x(l, x):
mid_index = len(l) // 2
if l[mid_index] > x:
finx_x(l[:mid_index], x)
elif l[mid_index] < x:
finx_x(l[mid_index+1:], x)
else:
print(l[mid_index])
return l[mid_index]
l = [x for x in range(100)]
a = finx_x(l, 12) # 12
print(a) # None
正确写法:
def finx_x(l, x):
mid_index = len(l) // 2
if l[mid_index] > x:
return finx_x(l[:mid_index], x)
elif l[mid_index] < x:
return finx_x(l[mid_index+1:], x)
else:
print(l[mid_index])
return l[mid_index]
l = [x for x in range(100)]
a = finx_x(l, 12) # 12
print(a) # 12
二分法查找:关键点,找到中间位置并作为下一次查找的起点或终点
def find(l, x):
if x not in l:
print(x, 'not in list')
return
start = 0
end = len(l)
while 1:
center = (end + start) // 2
if l[center] > x:
end = center
elif l[center] < x:
start = center
else:
return(center,l[center])
l = [x for x in range(100)]
print(find(l, 99)) # (99, 99)