zoukankan      html  css  js  c++  java
  • 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))
    最终版
  • 相关阅读:
    JS中的call、apply、bind 用法解疑
    style、currentStyle、getComputedStyle(不同浏览器获取css样式)区别介绍
    Ajax 整理总结(进阶)
    Ajax 整理总结(入门)
    js_面向对象编程
    李炎恢bootstarp_项目实战__瓢城企业(注释+源码)
    bootstrap学习笔记--bootstrap排版类的使用
    bootstrap学习笔记--bootstrap网格系统
    对mysql快速批量修改,查重
    MyISAM 和 InnoDB 的区别与优化
  • 原文地址:https://www.cnblogs.com/lijie123/p/9004813.html
Copyright © 2011-2022 走看看