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