自学Python--二分法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41402059/article/details/82561402

二分法查找:必须有序列表

递归返回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)

猜你喜欢

转载自blog.csdn.net/weixin_41402059/article/details/82561402