码迷,mamicode.com
首页 > 编程语言 > 详细

python学习(二分法)

时间:2018-07-22 19:19:29      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:调用   形参   else   排除   pre   nbsp   位置   不能   元素   

一. while循环二分

  二分查找.每次能排除掉一半的数据.查找的效率非常高.但是局限性比较大,必须是有序的序列才能用二分查找.

  要求:

    要查找的序列必须是有序序列.

#二分法查找某一个数的索引位置
lst = [11,22,33,44,55,66,77,88,99,111,122,133,144,155,166,177,188,199]
n = 122
left = 0
right = len(lst) - 1  # 以索引为边界
while left<=right:
    middle = (left + right) // 2  # 取一个在中间位置的索引
    if n >lst[middle]:   #如果要查找的数大于列表中索引在中间的元素
        left = middle +1    #重新定义边界,将左边界向右边挪一位
    elif n < lst[middle]:    #如果查找的数小于中间值
        right = middle -1   #重新定义边界,将右边界向左边挪一位
    else:   #如果查找的数等于中间值,直接打印middle
        print(在索引为+ str(middle) +的位置上!)
        break
else:
    print(不存在)

#结果:
#在索引为10的位置上!

二. 函数递归二分法

lst = [11, 22, 33, 44, 55, 66, 77, 88, 99, 111, 122, 133, 144, 155, 166, 177, 188, 199]
def f(left,right ,n):   #定义一个函数,给三个形参
    middle = (left+right)//2
    if n >lst[middle]:
        left = middle +1
    elif n<lst[middle]:
        right = middle - 1
    else:
        return middle
    return f(left,right,n)  #必须要加return,要不然会返回none,因为它只会返回给调用它的函数
i = f(0,len(lst)-1,99)
print(i)
#结果:
#8

三. 函数递归第二种方法(只能查找在不在序列内,不能查找具体位置)

lst = [11, 22, 33, 44, 55, 66, 77, 88, 99, 111, 122, 133, 144, 155, 166, 177, 188, 199]
def f(lst,n):   #因为这个方法会改变列表,所以要将列表作为参数
    left = 0
    right = len(lst) - 1
    middle = (left+right)//2
    if middle<0:
        print(没找到)
        return
    if n >lst[middle]:
        lst = lst[middle+1:]    #对列表切割
    elif n<lst[middle]:
        lst = lst[:middle-1]
    else:
        print(找到了)
        return
    f(lst,n)    #递归再次调用函数
f(lst, 76)

#结果:
#没找到

 

  

  

python学习(二分法)

标签:调用   形参   else   排除   pre   nbsp   位置   不能   元素   

原文地址:https://www.cnblogs.com/dong-/p/9351037.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!