python学习(二分法)

匿名 (未验证) 提交于 2019-12-02 22:56:40

一. 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)  #结果: #没找到

 

  

  

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!