day 17递归函数
#递归函数
#了解什么是递归:在函数中调用自己
#最大递归深度默认是997/998---是Python从内存角度出发做的限制
#能看懂递归
#能知道递归的应用场景
#初识递归 ---
#算法 ---- 二分查找算法
#三级菜单 ---递归实现
# while True: # print("从前有座山") # def story(): # print("从前有坐车") # story() # story()
#RecursionError: maximum recursion depth exceeded while calling a Python object
#递归错误:超过了递归的最大深度
# import sys # sys.setrecursionlimit(6789) #设置递归最大层数 # n = 0 # def story(): # global n # n += 1 # print(n) # print("从前有坐车") # story() # story()
#如果递归次数太多,就不适合使用递归来解决问题
#递归的缺点:占内存
#递归的优点:会让代码变简单
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 def age(2): if 2 == 4: return 40 elif 2 >0 and 2 <4: return age(2+1)+2 def age(3): if 3 == 4: return 40 elif 3 >0 and 3 <4: return age(3+1)+2 def age(4): if 4 == 4: return 40 elif 4 >0 and 4 <4: return age(4+1)+2 age(4)=40
#递归:递是指先从上往下;归是指后从下往上
#什么叫算法
#计算的方法:人脑复杂,计算机简单
#查找:找数据
#排序:
#最短路径
#我们现在学习的算法 都是过去式
#二分查找算法 必须处理有序的列表
#代码实现
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)
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 else: return '找不到这个值' ret = find(l,42) print(ret)
#67 发生两次调用
#66 发生好几次
#44 找不到
#age,二分查找,三级菜单代码看一遍
#斐波那契数列
#阶乘
#考试附加题
#递归实现