递归二分法查找数字


方法:正确的

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('找不到')

猜你喜欢

转载自blog.csdn.net/qq_37493425/article/details/86704723