递归函数
什么是递归函数:在函数中调用自己,自身函数就是递归
def story():
print("helo")
story()
print(111) #永远执行不到这句话,
#说明外层函数内存空间没有释放,这样容易浪费内存,那么超过固定限度就会报错
#RecursionError:超过递归最大深度
story()
第一次调用story()生成一个内存空间,第二次调用story()的时候,
第一个内存空间没有释放,因为第一个函数还没有执行结束
可以设置递归最大次数:
import sys
sys.setrecursionlimit(10000)
如果递归次数太多,就不适合使用递归来解决问题
递归的缺点:占内存
递归的优点:会让代码变简单
递归求年龄的列子
alex多大 -- 44 + 2
alex比egon大两岁
egon多大? -- 42 + 2
egon比wusir大两岁
wusir多大 -- 40 + 2
wusir比靳老板大两岁
靳老板多大?
靳老板40了 -- 40
递:往下走的是递,归:往上走的是归
问题分析一次一次的往下,结果的回归
怎么写函数呢?
分析
当n = 1的时候,问alex多大 , age(1) = age(2)+2 = age(n+1)+2
当n = 2的时候,问egon多大 , age(2) = age(3)+2 = age(n+1)+2
当n = 3的时候,问wusir多大 , age(3) = age(4)+4 = age(n+1)+2
当n = 4的时候,问靳老板多大 , age(4) = age(4) = 40
当n = 4 的时候,age = 40
当n < 4的时候,age(n+1) + 2
def age(n):
if n == 4:
return 40
elif n > 0 and n < 4 :
return age(n+1) + 2
print(age(1))
教你看递归:
def age(1):
if 1 == 4:
return 40
elif 1 > 0 and 1 < 4 :
return age(1+1) + 2
print(age(1))
def age(2):
if 2 == 4:
return 40
elif 2 > 0 and 2 < 4 :
return age(2+1) + 2
print(age(2))
。。。。。。。。。
二分查找算法特点:
1、必须处理有序的列表
2、每次把数据一分为二,取列表中间值,在判断大小
如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做?
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):
mid_index = len(l) // 2
#mid_index = len(new_l) // 2 重复操作
find(new_l,aim)
elif l[mid_index] > aim:
new_l = l[:mid_index]
find(new_l,aim) #递归
else:
print('找到了',mid_index,l[mid_index])
find(l,66)
改良版
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 = 0,end = len(l)):
mid_index = (end - start) // 2 + start #计算中间值
if l[mid_index] < aim:
find(l,aim,start = mid_index+1,end=end)
elif l[mid_index] > aim:
find(l,aim,start = start,end=mid_index-1)
else:
print('找到了',mid_index,aim)
find(l,66)
升级版
参数 end
返回值
找不到的话怎么办
def find(l,aim,start = 0,end = None):
end = len(l) if end is None else end
mid_index = (end - start) // 2 + start #计算中间值
if start <= end:
if l[mid_index] < aim:
return find(l,aim,start = mid_index+1,end=end)
elif l[mid_index] > aim:
return find(l,aim,start = start,end=mid_index-1)
else:
return mid_index
else:
return "找不到这个值"
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]
ret = find(l,66)
print(ret)
试一试
67 发生两次调用
66发生好几次
44找不到

浙公网安备 33010602011771号