1. 初识递归
什么是递归:在函数中调用自身函数
最大递归深度默认是997/998 —— 是python从内存角度出发做得限制
递归演示范例:
def story():
print("从前有座山")
story()
story()
1.1 递归报错信息
RecursionError: maximum recursion depth exceeded while calling a Python object
上句是递归的错误,超过了递归的最大深度
1.2 破除默认深度997
但能跑多少次,看每台电脑的内存大小。
import sys
sys.setrecursionlimit(1000000)
n = 0
def story():
global n
n += 1
print(n)
story()
story()
1.3 递归结论
如果递归次数太多,就不适合使用递归来解决问题
递归的缺点 : 占内存
递归的优点: 会让代码变简单
1.4 递归例子
题目:
alex 多大 n = 1 age(1) = age(2)+2 = age(n+1) + 2
alex比egon大两岁
egon多大? n = 2 age(2) = age(3) + 2 = age(n+1) +2
egon比wusir大两岁
wusir多大 n = 3 age(3) = age(4) + 2 = age(n+1) +2
wusir比金老板大两岁
金老板多大?
金老板40了 n = 4 age(4) = 40
n = 4 age(4) = 40
n <4 age(n) = 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))
执行结果:
46
如何看递归:
# def age(1):
# if 1 == 4:
# return 40
# elif 1 > 0 and 1 < 4:
# return 46
#
# def age(2):
# if 2 == 4:
# return 40
# elif 2 >0 and 2 < 4:
# age(3) + 2 None +2
#
# def age(3):
# if 3 == 4:
# return 40
# elif 3 >0 and 3 < 4:
# 42
#
# def age(4):
# if 4 == 4:
# return 40
# elif n >0 and n < 4:
# age(n+1) + 2
2. 初识算法
什么叫算法
计算的方法 : 人脑复杂 计算机简单
99 * 13 = 1287 = 13*100 - 13
查找 : 找数据
排序 :
最短路径
我们学习的算法 都是过去时
了解基础的算法 才能创造出更好的算法
不是所有的事情都能套用现成的方法解决的
有些时候会用到学过的算法知识来解决新的问题
二分查找算法 必须处理有序的列表
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]
范例1.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]
def find(l,aim):
mid_index = len(l) // 2
if l[mid_index] < aim:
new_l = l[mid_index+1 :]
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)
执行结果:
找到了 0 66
范例1.2:
代码完善
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 = 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,aim
else:
return '找不到这个值'
ret= find(l,44) # 找不到
print(ret)
ret= find(l,66) # 发生好几次
print(ret)
ret= find(l,67) # 发生两次调用
print(ret)
执行结果:
找不到这个值
(17, 66)
(18, 67)
3. 总结
超过最大递归限制的报错
只要写递归函数,必须要有结束条件。
返回值
不要只看到return就认为已经返回了。要看返回操作是在递归到第几层的时候发生的,然后返回给了谁。
如果不是返回给最外层函数,调用者就接收不到。
需要再分析,看如何把结果返回回来。