递归函数 二分查找
#递归函数
#递归: 自己调用自己
# 默认递归次数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))