方法:正确的
l = [2, 3, 5, 10, 15, 16, 18, 22, 26, 30, 32, 35, 41, 42, 43, 55, 56, 66, 67, 69, 72, 76, 82, 83, 88]
def find(l,aim,start = 0,end = None):
end = len(l) if end is None else end
mid_index = (end - start)//2 + start
if start <= end:
if l[mid_index] < aim:
return find(l,aim,start =mid_index+1,end=end)
elif l[mid_index] > aim:
return find(l, aim, start=start, end=mid_index-1)
else:
return mid_index
else:
return '找不到这个值'
ret= find(l,66)
print(ret)
拆分分析:
# 执行:
def find(l,aim,start = 0,end = None): # l,66,
end = len(l) if end is None else end #25
mid_index = (end - start)//2 + start #12
if start <= end:#0<25
if l[mid_index] < aim: #l[12]<66 成立
return find1(l,aim,start =mid_index+1,end=end) # l,66,start=13,end=25 第一次调用 #接收返回值17
elif l[mid_index] > aim:
return find1(l, aim, start=start, end=mid_index-1)
else:
return mid_index
else:
return '找不到这个值'
#第一次调用
def find1(l,aim,start = 12+1,end = 25): # l,66,13,25
end = len(l) if end is None else end# 25
mid_index = (end - start)//2 + start #(25-13)//2+13=19
if start <= end: #13<=25
if l[mid_index] < aim:
return find1(l,aim,start =mid_index+1,end=end)
elif l[mid_index] > aim: #l[19]>66 成立
return find2(l, aim, start=start, end=mid_index-1) #l,66,start=13,end=18第二次调用 #接收返回值17
else:
return mid_index
else:
return '找不到这个值'
#第二次调用
def find2(l,aim,start = 13,end = 19-1): # l,66,13,18
end = len(l) if end is None else end# 18
mid_index = (end - start)//2 + start #(18-13)//2+13=15
if start <= end: #13<=18
if l[mid_index] < aim: #l[15]<66 成立
return find1(l,aim,start =mid_index+1,end=end) #l,66,start=15+1,end=18第三次调用 #接收返回值17
elif l[mid_index] > aim:
return find2(l, aim, start=start, end=mid_index-1)
else:
return mid_index
else:
return '找不到这个值'
#第三次调用
def find1(l,aim,start = 15+1,end = 18): # l,66,15+1,18
end = len(l) if end is None else end# 18
mid_index = (end - start)//2 + start #(18-16)//2+16=17
if start <= end: #13<=18
if l[mid_index] < aim: #l[17]<66 不成立
return find(l,aim,start =mid_index+1,end=end) #l,66,start=15+1,end=18第三次调用
elif l[mid_index] > aim: #l[17]>66 不成立
return find(l, aim, start=start, end=mid_index-1)
else:#l[17]==66 成立
return mid_index#返回值索引17
else:
return '找不到这个值'
ret= find(l,66)
print(ret)
并且分析找不到的解析调用
s1=[2,5,8,9,11,13,18,19,25,26,27,29,30,31,35,36,39,44,50]
def find_num1(s,num,start=0,end=None): #s1 ,20,0,
end=len(s) if end is None else end# 18
index =( end-start)//2+start # 18//2=9
if start<=end:
if num > s[index]:
#new_s =s[index+1:]
return find_num1(s, num,start=index+1,end=end)
elif num <s[index] : #20<s[9]
#new_s = s[:index]
return find_num1(s, num,start=start,end=index-1) #s,20,start=0,end=9-1=8
else:
return ('找到了',index,s[index])
else:
return ('找不到')
ret=find_num1(s1,20)
print(ret)
#第一次调用
def find_num1(s,num,start=0,end=8): #s1,20,0,8
end=len(s) if end is None else end# 8
index =( end-start)//2+start # 8//4=2
if num > s[index]: #20>s[2]
#new_s =s[index+1:]
find_num1(s, num,start=index+1,end=end) #s1,20,start=3,end=8
elif num <s[index] :
#new_s = s[:index]
find_num1(s, num,start=start,end=index-1)
else:
print('找到了',index,s[index])
#第三次调用
def find_num1(s,num,start=3,end=8): #s1,20,start=3,end=8
end=len(s) if end is None else end# 8
index =( end-start)//2+start # 5//2+3=5
if num > s[index]: #20>s[5]
#new_s =s[index+1:]
find_num1(s, num,start=index+1,end=end) #s1,20,6,8
elif num <s[index] :
#new_s = s[:index]
find_num1(s, num,start=start,end=index-1)
else:
print('找到了',index,s[index])
#第四次调用
def find_num1(s,num,start=6,end=8): ##s1,20,start=6,end=8
end=len(s) if end is None else end# 8
index =( end-start)//2+start # 4
if num > s[index]: #20>s[4]
#new_s =s[index+1:]
find_num1(s, num,start=index+1,end=end) #s1,20,5,8
elif num <s[index] :
#new_s = s[:index]
find_num1(s, num,start=start,end=index-1)
else:
print('找到了',index,s[index])
#第五次调用
def find_num1(s,num,start=5,end=8): ##s1,20,5,8
end=len(s) if end is None else end# 8
index =( end-start)//2+start # 6
if num > s[index]: #20>s[6]
#new_s =s[index+1:]
find_num1(s, num,start=index+1,end=end) #s1,20,7,8
elif num <s[index] :
#new_s = s[:index]
find_num1(s, num,start=start,end=index-1)
else:
print('找到了',index,s[index])
#第六次调用
def find_num1(s,num,start=7,end=8): ##s1,20,7,8
end=len(s) if end is None else end# 8
index =( end-start)//2+start # 7
if num > s[index]: #20>s[7]
#new_s =s[index+1:]
find_num1(s, num,start=index+1,end=end) #s1,20,8,8
elif num <s[index] :
#new_s = s[:index]
find_num1(s, num,start=start,end=index-1)
else:
print('找到了',index,s[index])
# 第七次调用
def find_num1(s, num, start=8, end=8): #s1,20,8,8
end = len(s) if end is None else end # 8
index = (end - start) // 2 + start # 8
if num > s[index]: # 20>s[7]
# new_s =s[index+1:]
find_num1(s, num, start=index + 1, end=end) # s1,20,9,8
elif num < s[index]:
# new_s = s[:index]
find_num1(s, num, start=start, end=index - 1)
else:
print('找到了', index, s[index])
# 第八次调用
def find_num1(s, num, start=9, end=8): ## s1,20,9,8
end = len(s) if end is None else end # 8
index = (end - start) // 2 + start # (8-9)//2+9
if start<=end:
if num > s[index]: # 20>s[7]
# new_s =s[index+1:]
find_num1(s, num, start=index + 1, end=end)
elif num < s[index]:
# new_s = s[:index]
find_num1(s, num, start=start, end=index - 1)
else:
print('找到了', index, s[index])
else:
print('找不到')