递归函数 二分查找

#递归函数
#递归: 自己调用自己
# 默认递归次数998
# 可以自己设置递归次数
def age(n):
    if n==1:
        return 26       #当下面的age(4)依次拿到一的时候这里就返回26,然后和下面累加三次的2相加
    else:
        return age(n-1)+2       #这里的返回值每次都累加2,从4到2一共累加三次,
print (age(4))      #把这里的4一个一个的递给age(n)这里的n,第一次递上去的是4,第二次是3,依次递归
# 结果:32

 

#递归到一定次数,就回去主动终止,一般是998
def func(x):
    x+=1
    print (x)
    func(x)
n=0
func(n)
# 一直累加到998

 

 

import sys
sys.setrecursionlimit(10000)        #这里给递归函数设置一个最大值,其实电脑跑不到这么多,只会跑到电脑的最大极限
def func(x):
    x+=1
    print (x)
    func(x)
n=0
func(n)

 

 

 

# 二分查找
# 算法, 最经典最简单的算法.
# 前提: 有序的不重复的数字序列.
l1 = [2, 3, 5, 10, 15, 16, 18]
def two_find(l,aim,start=0,end=None):
    end = len(l)-1 if end is None else end
    mid_index=(end-start)//2+start
    if start <= end:
        if aim>l[mid_index]:
            return two_find(l,aim,start=mid_index+1,end=end)
        elif aim<l[mid_index]:
            return two_find(l,aim,start=start,end=mid_index)
        elif aim==l[mid_index]:
            return mid_index
        else:
            return None
print (two_find(l1,15))

 

 

#二分查找,用while循环做
lst = [11,22,33,44,55,66,77,88,99,123,234,345,456,567,678,789,1111]
n=11
kai=0
wei=len(lst)-1
count=1
while kai<=wei:
    middle=(kai+wei)//2
    if n > lst[middle]:
        kai=middle+1
    elif n<lst[middle]:
        wei=middle-1
    else:
        print('存在')
        print(middle)
        break
    count=count+1
else:
    print('不存在')

 

# 用递归写二分查找
lst = [11,22,33,44,55,66,77,88,99,123,234,345,456,567,678,789,1111]
def func(kai,wei,n):
    zhong=(kai+wei)//2
    if kai>wei:
        return -1
    if n > lst[zhong]:
        kai=zhong+1
    elif n<lst[zhong]:
        wei=zhong-1
    else:
        return zhong
    return func(kai,wei,n)       #这个return必须加,不然返回的一直是None
print(func(0,len(lst)-1,66))

 

posted @ 2018-06-22 17:34  惊世风情  阅读(158)  评论(0编辑  收藏  举报