five--递归函数

1.复习

 1  1.只要和计算时间有关的,一定放在离func最近的地方
 2     2.range本身是  迭代器
 3     3.生成器和迭代器的本质是一样的    一般是想取所有值,又不同一时间出现在内存中
 4     4.迭代器--可以被for循环 本质:节省内容空间  没有索引取值的概念  ---公式
 5     5.生成器:python内部提供的;yield函数 执行生成器函数,得到一个生成器,不会执行这个函数中的代码!!  有几个yield,就能从中取出几个值
 6           生成器表达式:也会返回一个生成器,不会直接被执行
 7           注意:!!!
 8           1.每一个生成器都会从头开始取值,当取到最后的时候,生成器中就没有值了
 9          2.一个生成器只能用一次
10          例子
11          不明白打印id
12          装饰器、生成器可先放一放、刷题看!框架项目作业 找工作前,再刷一次面试题
13      6.内置、匿名
14       5个常考(map、filter、sorted、max、min)
15         filter 3种写法。。。(+lambda)  自己复习!
 1 # 装饰器的进阶
 2     # 给装饰器加上一个开关  - 从外部传了一个参数到装饰器内
 3     # 多个装饰器装饰同一个函数 - 套娃
 4         # 每个装饰器都完成一个独立的功能
 5         # 功能与功能之间互相分离
 6         # 同一个函数需要两个或以上额外的功能
 7 # def wrapper1(func):
 8 #     def inner(*args,**kwargs):
 9 #         '''执行a代码'''
10 #         ret = func(*args,**kwargs)
11 #         '''执行b代码'''
12 #         return ret
13 #     return inner
14 #
15 # def wrapper2(func):
16 #     def inner(*args,**kwargs):
17 #         '''执行c代码'''
18 #         ret = func(*args,**kwargs)
19 #         '''执行d代码'''
20 #         return ret
21 #     return inner
22 #
23 # @wrapper1
24 # @wrapper2
25 # def func():pass
26 
27 # a c func d b
28 
29 # timmer login
30 # timmer logger
31 
32 # 生成器和迭代器
33 # 迭代器 : iter next
34 # 可以被for循环 节省内存空间 它没有所谓的索引取值的概念 当前的值和下一个值- 公式
35 # 生成器和迭代器本质上是一样的
36     # yield函数
37         # 执行生成器函数 会得到一个生成器 不会执行这个函数中的代码
38         # 有几个yield,就能从中取出多少个值
39     # 生成器表达式
40         # 生成器表达式也会返回一个生成器 也不会直接被执行
41         # for循环里有几个符合条件的值生成器就返回多少值
42     # 每一个生成器都会从头开始取值,当取到最后的时候,生成器中就没有值了
43         # 一个生成器只能用一次
44 # def fff():
45 #     for i in range(10):
46 #         yield i
47 # g2 = (i**i for i in range(20))
48 # g = fff()
49 # print(next(g))     0
50 # print(next(g))       1
51 # print(next(g))    2
52 
53 # print(next(fff()))    0
54 # print(next(fff()))    0
55 # print(next(fff()))    0
56 # for i in fff():
57 #     print(i)     
58 
59 # 如果现在明白 可以趁热打铁 先巩固一下
60 # 如果不明白 先放一放
61     # 框架和项目 作业
62     # 毕业的时候 找工作之前 再刷一次面试题
63 # 要相信计算是不会出错
64 # python11期
65 
66 # 内置函数和匿名函数
67 # map filter sorted max min zip
68 打印0-19的偶数
69 # def func(n):
70 #     if n%2 == 0:
71 #         return True
72 # ret = filter(func,range(20))
73 # ret = filter(lambda n: True if n%2 == 0 else False ,range(20))
74 # ret = filter(lambda n: n%2 == 0 ,range(20))
View Code

2.递归

7.递归(考脑力)----在函数的内部调用自己,,不知道有多少层的字典调用自身的用递归
        递归的最大深度:998
        小例子:猜年龄
        递归求解--二分查找算法:只针对有序的数字集合的查找问题,快速
            算法:在空间(内存里)时间(执行时间)上有优势的方法
            常考算法:快速排序、堆排序      冒泡排序
            查找:可用二分查找算法
            写法:1.递归,位置为0  2.优化  列表不能变:l,num,start,end
                注意mid要+start     优化写法放在cal中   解析:执行过程有归,开始都是None
                注2:问题:1.参数太多:加if判断(end=len(l)-1 if end is None else end)
                    2.找的数不存在 (陷入17-18死循环)-解决方法:if start<=end:  else:print('没找到)
                    3.结果不能print  要return   上一层判断中都要加上return ,否则是None,没收到返回值(参考图片递归初识2--加return)  可以画图判断

  

 1 # 递归 —— 在函数的内部调用自己
 2 # 递归的最大深度 : 998
 3 # 小例子:
 4 # 猜年龄
 5 # alex多大了     alex 比 wusir 大两岁  40+2+2
 6 # wusir多大了    wusir 比 金老板大两岁   40+2
 7 # 金老板多大了   40了
 8 # age(1)
 9 # n = 1 age(2)+2
10 # n = 2 age(3)+2
11 # n = 3 age(3) = 40
12 
13 # def age(n):
14 #     if n == 3:
15 #         return 40
16 #     else:
17 #         return age(n+1)+2
18 #
19 # print(age(1))
20 
21 # # n = 1
22 # def age(1):
23 #     if 1 == 3:
24 #         return 40
25 #     else:
26 #         return age(2)+2
27 #
28 # # n = 2
29 # def age(2):
30 #     if 2 == 3:
31 #         return 40
32 #     else:
33 #         return age(3)+2
34 #
35 # # n = 3
36 # def age(3):
37 #     if 3 == 3:
38 #         return 40
39 
40 # 递归求解二分查找算法
41 # 算法
42 # 99*99 = 99*(100-1) = 9900-99 = 9801
43 # 人类的算法
44 # 99 * 99
45 
46 # 算法 计算一些比较复杂的问题
47     # 所采用的 在空间上(内存里) 或者时间上(执行时间) 更有优势的方法
48 # 排序 500000万个数 快速排序 堆排序 冒泡排序
49 # 查找
50 
51 # 递归求解二分查找算法 : 有序的数字集合的查找问题
引入
 1 def func(l,aim):
 2     mid = (len(l)-1)//2
 3     if l:
 4         if aim > l[mid]:
 5             func(l[mid+1:],aim)
 6         elif aim < l[mid]:
 7             func(l[:mid],aim)
 8         elif aim == l[mid]:
 9             print("bingo",mid)
10     else:
11         print('找不到')
12 func(l,66)
13 func(l,6)
简单版
 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]
 2 # # 列表不能变
 3 # def cal(l,num,start,end):
 4 #     mid = (end - start)//2 + start
 5 #     if l[mid] > num :
 6 #         cal(l, num, start, mid-1)
 7 #     elif l[mid] < num:      # 13  24
 8 #         cal(l,num,mid+1,end)
 9 #     else:
10 #         print('找到了',mid,l[mid])
11 #
12 # cal(l,60,0,len(l)-1)
13 # #
14 # # def cal(l,num=66):
15 # #     length = len(l)
16 # #     mid = length//2
17 # #     if num > l[mid]:
18 # #         l = l[mid+1:]
19 # #         cal(l,num)
20 # #     elif num < l[mid]:
21 # #         l = l[:mid]
22 # #         cal(l, num)
23 # #     else:
24 # #         print('找到了',l[mid],mid)
25 # # cal(l,66)
26 #
27 # 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]
28 # def cal(l,66,0,24):
29 #     mid = 12 + 0
30 #     if 41 > 66 :
31 #         cal(l, num, start, mid-1)
32 #     elif 41 < 66:      # 13  24
33 #         cal(l,66,13,24)
34 #     else:
35 #         print('找到了',mid,l[mid])
36 #
37 # 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]
38 # def cal(l,66,13,24):
39 #     mid = 5 + 13
40 #     if 67 > 66 :
41 #         cal(l, 66, 13, 17)
42 #     elif l[mid] < num:      # 13  24
43 #         cal(l,num,mid+1,end)
44 #     else:
45 #         print('找到了',mid,l[mid])
46 #
47 # 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]
48 # def cal(l,66,13,17):
49 #     mid = 2 + 13
50 #     if 55 > 66 :
51 #         cal(l, num, start, mid-1)
52 #     elif 55 < 66:
53 #         cal(l,66,16,17)
54 #     else:
55 #         print('找到了',mid,l[mid])
56 #
57 # 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]
58 # def cal(l,60,16,17):
59 #     mid =0 + 16
60 #     if 56 > 60 :
61 #         cal(l, num, start, mid-1)
62 #     elif 56 < 60:      # 13  24
63 #         cal(l,60,17,17)   #None
64 #     else:
65 #         print('找到了',mid,l[mid])
66 # #
67 # # 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]
68 # def cal(l,60,17,17):
69 #     mid = 0 + 17
70 #     if 60 > 66 :
71 #         cal(l, num, start, mid-1)
72 #     elif 60 < 66:      # 13  24
73 #         return cal(l,60,18,17)
74 #     else:
75 #         print('找到了',17,66)
76 #
77 # def cal(l, 60, 18, 17):
78 #     if start <end:
79 #         mid = 0+18
80 #         if 67 > 66:
81 #             cal(l, 60, 18,17)
82 #         elif 60 < 66:  # 13  24
83 #             cal(l, 60, 18, 17)
84 #         else:
85 #             print('找到了', 17, 66)
86 #     else:
87 #         print('没找到')
分析--可忽略
 1 # 算法
 2 # def cal(l,num,start=0,end=None):
 3 #     # if end is None:end = len(l)-1
 4 #     end = len(l)-1 if end is None else end
 5 #     if start <= end:
 6 #         mid = (end - start)//2 + start
 7 #         if l[mid] > num :
 8 #             return cal(l, num, start, mid-1)
 9 #         elif l[mid] < num:      # 13  24
10 #             return cal(l,num,mid+1,end)
11 #         else:
12 #             return mid
13 #     else:
14 #         return None
15 # 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]
16 # print(cal(l,56))
最终版

猜你喜欢

转载自www.cnblogs.com/lijie123/p/9004813.html