python递归函数,二分查找,(可以尝试着做员工信息表了)

递归函数
自己调用自己
def func():
print(666)
func()
func()#maximum recursion depth exceeded while calling a Python object(调用函数时超出例了最大递归深度)
import sys
sys.setrecursionlimit(100000)#手动设置最大递归深度为100000
count=1
def func(n):#默认最大递归深度998
    print(n)
    n+=1
    func(n)
func(count)

'''
n = 1  aa  age(1) = 23
n = 2  bb   age(2) = age(1) + 2
n = 3  cc  age(3) = age(2) + 2
n = 4  dd  age(4) = age(3) + 2

'''
def age(n):#要多琢磨
    if n==1:
        return 23
    else:
        return age(n-1)+2
age(4)

def age(n):
    if n == 1:
        return 23
    else:
        return age(n - 1) + 2   #age(4) = age(3) + 2
ret = age(4)

def age(n):
    if n == 1:
        return 23
    else:
        return age(n - 1) + 2   #age(3) = age(2) + 2
ret = age(3)

def age(n):
    if n == 1:
        return 23
    else:
        return age(1) + 2   #age(2) = age(1) + 2
ret = age(2)

def age(n):
    if n == 1:
        return 23   #age(1) = 23
    else:
        return age(1) + 2
ret = age(1)
二分查找
用代码写的计算方式
最简单,比较经典的算法。
数字,有序,不重复
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] ==66: #if l.index(66)==i:
        print(i)
        break# for else 语句,如果不加break,for 循环走完后,还走else
else:
    print('找不到......')
'''
目标值:aim=66
寻找中间索引mid_index=len(l)//2
aim 与中间索引对应的值作比较。
aim>mid_index:
    l[mid_index+1:]
aim<mid_index:
    l[:mid_index]
aim==mid_index:
    return mid_index
'''
print(len(l))
初级
l1 = [1, 3, 5, 7, 8, 10, 11]
def binary_search(li,aim):#1次 [1, 3, 5, 7, 8, 10, 11],aim=8  2次[ 8, 10, 11] aim=8  3次[ 8] aim=8
    mid_index=len(li)//2 #1次 3  2次 1 3次 0
    if aim>li[mid_index]:#1 次 aim=8>7
        return binary_search(li[mid_index+1:],aim)#1次 [ 8, 10, 11] aim=8
    elif aim<li[mid_index]:#2次 aim=8<10
        return binary_search(li[:mid_index],aim)#2次 [8] aim=8
    elif aim==li[mid_index]:#3次 aim=8==7
        return mid_index#3次 0
    else:
        return None
print(binary_search(l1,8))
升级
l1 = [1, 3, 5, 7, 8, 10, 11]
def binary_seach(li,aim,start=0,end=None):#此函数的前提是end>=start,else 是不会走的,找不到直接报错。
    end=len(li)-1 if end is None else end
    mid_index=(end-start)//2+start#必须的理解
    if aim>li[mid_index]:
        return binary_seach(li,aim,start=mid_index+1,end=end)
    elif aim<li[mid_index]:
        return binary_seach(li,aim,start=start,end=mid_index)
    elif aim==li[mid_index]:
        return mid_index
    else:
        return None
print(binary_seach(l1,3))
再升级
l1 = [1, 3, 5, 7, 8, 10, 11]
def binary_seach(li,aim,start=0,end=None):
    end=len(li)-1 if end is None else end
    mid_index=(end-start)//2+start#必须的理解
    if end>=start:
        if aim>li[mid_index]:
            return binary_seach(li,aim,start=mid_index+1,end=end)
        elif aim<li[mid_index]:
            return binary_seach(li,aim,start=start,end=mid_index)
        elif aim==li[mid_index]:
            return mid_index

    else:
        return None
print(binary_seach(l1,11))
详解:
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) - 1 if end is None else end
    mid_index = (end - start) // 2 + start # 第一次 mid 3  第二次:mid 1  第三次:mid:2  第四次:mid:3

    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,6))



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 @ 2018-05-19 23:47  老虎死了还有狼  阅读(131)  评论(0编辑  收藏  举报