0518Python基础-内置函数-二分查找

1、昨日内容回顾

    len() 测试个数

    eval() 去掉字符串的引号,返回内部结果

    eval('1+1') ---> 2

    exec() 去掉字符串的引号,执行内部代码

    ret = ''' if True:

            print(666)

    '''

    exec(ret)

    range

    next()

    iter()

    reversed() 返回的是迭代器

    sorted(iterable,key,reverse)  return list       key

    zip(iter1,iter2,iter3....) 拉链方法  迭代器

    map(key,iterable) 循环模式。[i for i in iterable] 返回的是迭代器。     key

    filter(key,iterable) 筛选模式[i for i in iterable if ...] 返回的是迭代器。   key

    min() 最小值,返回是int str。    key

    sum(iterable,argv) 求和。

    max() 最大值。返回是int str。    key

    open() 文件操作

    repr 原形毕露。

    divmod(被除数,除数)    返回值(商,余数)

    dir()

    abs() 绝对值。

    callable

    bytes()   str ---> bytes

    locals() 当前位置的局部变量。

    globals() 全局变量。

 

 

2、递归函数

递归函数:在一个函数里在调用这个函数本身。自己调用自己

递归的最大深度:998

 

修改默认递归深度

import sys

sys.setrecursionlimit(100000)

 

可以通过这种方式来修改递归的最大深度,刚刚我们将python允许的递归深度设置为了10w,至于实际可以达到的深度就取决于计算机的性能了。不过我们还是不推荐修改这个默认的递归深度,因为如果用997层递归都没有解决的问题要么是不适合使用递归来解决要么是你代码写的太烂了~~~

 

def foo(n):

    print(n)

    n += 1

    foo(n)

foo(1)

 

'''

n = 1  太白   age(1) = 23

n = 2  日天   age(2) = age(1) + 2

n = 3  wusir  age(3) = age(2) + 2

n = 4  alex  age(4) = age(3) + 2

 

'''

 

def age(n):

    if n == 1:

        return 23

    else:

        return age(n-1) + 2

 

print(age(4)) # 23 + 2 + 2 + 2

 

"""

def age(4):

    if n == 1:

        return 23

    else:

        return age(n-1) + 2        age(4) =  age(3) + 2

 

ret = age(4)

 

def age(3):

    if n == 1:

        return 23

    else:

        return age(n-1) + 2        age(3) = age(2) + 2

       

def age(2):

    if n == 1:

        return 23

    else:

        return age(1) + 2          age(2) = age(1) + 2

 

def age(1):

    if n == 1:

        return 23                   age(1) = 23

    else:

        return age(1) + 2         

 

"""

 

3、二分查找

 

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]

你观察这个列表,这是不是一个从小到大排序的有序列表呀?

如果这样,假如我要找的数比列表中间的数还大,是不是我直接在列表的后半边找就行了?

 

这就是二分查找算法!

那么落实到代码上我们应该怎么实现呢? 

  

简单版二分法

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]

print(l.index(66))

 

count = 0

for i in l:

    if i == 66:

        print(count)

    count += 1

for i in range(len(l)):

    if l[i] == 47:

        print(i)

        break

 

else:

    print('找不到....')

'''

目标值:aim = 66

寻找中间索引: min_index = len(l) // 2

aim 与 中间索引对应的值进行比较

    aim > l[min_index]:

        l[min_index+1:]

    aim < l[min_index]:

        l[:min_index-1]

    aim == l[min_index]

        return min_index

'''

 

升级版二分法

 

l1 = [1, 3, 5, 7, 8, 10, 11]

 def binary_search(li,aim,start=0,end=None):      # 第一次:[1, 3, 5, 7, 8, 10, 11] aim 6,start 0,end 6

                                                  第二次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:0,end:3

                                                  第三次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:2,end:3

                                                  第四次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3

                                                  第五次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3

    end = len(li)  if end is None else end

    mid_index = (end - start) // 2 + start # 第一次 mid 3  第二次:mid 1  第三次:mid:2  第四次:mid:3

    if start <= end:

        if aim > li[mid_index]:

            return binary_search(li, aim, start=mid_index+1, end=end)  # 第二次:[1, 3, 5, 7, 8, 10, 11] aim 6 start: 2 end:3

                                                                       第三次:[1, 3, 5, 7, 8, 10, 11] aim 6 start: 3 end:3

        elif aim < li[mid_index]:

            return binary_search(li, aim, start=start, end = mid_index) # 第一次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:0,end:3

                                                                        第四次:[1, 3, 5, 7, 8, 10, 11] aim 6 start:3,end:3

        elif aim == li[mid_index]:

            return mid_index

    else:

        return None

print(binary_search(l1,3))

print(binary_search(l1,11))

 

 

 

posted on 2018-05-18 20:31  kindle86  阅读(160)  评论(0编辑  收藏  举报

导航