一、递归函数
1.递归调用的定义
递归调用是函数嵌套调用的一种特殊形式,函数在调用时,直接或间接调用了自身,就是递归调用
def foo(n):
print(n)
n += 1
foo(n)
foo(1)
2.递归最大深度
最大递归深度默认是997/998 —— 是python从内存角度出发做得限制
超过递归深度会报错:RecursionError: maximum recursion depth exceeded while calling a Python object
修改递归最大深度
import sys
sys.getrecursionlimit()
sys.setrecursionlimit(2000)
n=1
def test():
global n
print(n)
n+=1
test()
test()
二、二分查找算法
二分查找算法 必须处理有序的列表
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]
def find(l, aim, start = None, end = None):
#判断开始索引值是否为空,如为空返回0
start = start if start else 0
# 判断结尾索引值是否为空,为空返回整个列表的长度
end = len(l) if end is None else end
# 获取中间值的索引,结尾减开始的索引整除加上开始的索引,比如:(24-0)//2+0就是中间值41的索引
mid_index = ( end - start ) // 2 + start
# 判断开始的索引是否小于或等于结尾索引,大于说明这个值不存在
if start <= end:
# 判断中间值是否大于查找的值,大于则查找的值在左边
if l[mid_index] > aim:
# 在调用find()查找,查找的值在左边,所开始的索引不变,结尾的索引则是中间值的索引减1
return find(l, aim, start = start, end = mid_index - 1)
# 判断中间值是否小于查找的值,小于则则查找的值在右边
elif l[mid_index] < aim:
# 在调用find()查找,查找的值在右边,所开始的索引则是中间值的索引加1,结尾的索引不变,
return find(l, aim ,start = mid_index + 1, end = end )
# 相等则返回查找的值的索引值
else:return mid_index
else:
return None
print(find(l,66))
结果:17