• day15 什么是递归/递归与回溯


    上节课复习
    1、生成器
    def func():
    yield
    g=func()
    next(g)

    x=yield
    2、三元表达式
    res=x if 条件 else y
    3、列表推导式,字典生成式,生成器表达式
    l=[表达式 for i in 可迭代对象 if 条件]
    g=(表达式 for i in 可迭代对象 if 条件)
    d={k:v for i in 可迭代对象 if 条件}
    4、max,zip
    max(可迭代对象)
    生成器=zip(可迭代对象1,可迭代对象2)
    g=zip('hello',[1,2,3]) 
    # print(g)
    print(list(g))

    什么是函数递归?

    1.函数递归调用(是一种特殊的嵌套调用):在调用一个函数的过程中,直接或者间接调用了函数本身

     递归必须要有两个阶段:

      递推:一层一层递归调用下去,强调每进入下一层递归问题的规模必须有所减少

      回溯:递归必须要有一个明确的结果和条件,在满足该条件时结束递推阶段

        开始一层一层回溯

      递归的精髓在于通过不断重复逼近一个最终的结果

    2.为什么要用函数递归

    age(5)=age(4)+2
    age(4)=age(3)+2
    age(3)=age(2)+2
    age(2)=age(1)+2
    age(1)=26
    

      

    def age(n):
        if n==1:
            return 26
        res=age(n-1)+2
        return res
    print(age(5))
    
    l=[1,[2,[3,[4,[5,[6,[7,[8,[9,]]]]]]]]]
    def tell(l):
        for item in l:
            if type(item) is list:
                #继续进入下一层递归
                tell(item)
            else:
                print(item)
    tell(l)
    

    二分法

    有一个从小到大排列的整型数字列表 # 这种方法效率太低  算法就是解决问题对的最优方法,按照什么样的逻辑把问题高效的解决掉,这就是算法
    nums=[1,3,7,11,22,34,55,78,111,115,137,149,246,371]
    10 in nums
    for item in nums:
        if item == 10:
            print('find it')
            break
    else:
        print('not exists')
    

    正确的操作

    nums=[1,3,7,11,22,34,55,78,111,115,137,149,246,371]
    def search(search_num,nums):
        print(nums)
        if len(nums)==0:
            print('不存在')
            return
        mid_index=len(nums)//2
        if search_num>nums[mid_index]:
            #in the right
            nums=nums[mid_index+1:]#列表这一刻被切空
            search(search_num,nums)
        elif search_num<nums[mid_index]:
            #in the left
            nums=nums[:mid_index]
            search(search_num,nums)
        else:
            print('find it')
    
    search(31,nums)

    匿名函数(没有名字)

    #匿名函数:没有绑定名字的下场是用一次就回收了
    # def func(x,y):#func=函数的内存地址
    #     return x+y
    
    # print(lambda x,y:x+y)  #这里的x+y相当于有名函数 return x+y
                            #匿名函数加括号就能运行
    res=(lambda x,y:x+y)(1,2)
    print(res) #这种太丑
    
    f=lambda x,y:x+y
    print(f)
    print(f(1,2))
    匿名函数与其他函数一起使用,用一次就丢掉了
    #max min map filter sorted
    

    匿名函数的应用

    方式1 有名函数
    salaries={'egon':3000,'alex':100000000,'wupeiqi':10000,'yuanhao':2000} #比较字典key的大小,如果是列表不是字典的话可以 # max的工作原理 # 1.首先将可迭代对象变成迭代器对象 # 2.res=next(可迭代器对象),将res当作参数传给key指定的函数 # 然后将该函数的返回值当作判断依据 def func(k): return salaries[k] print(max(salaries,key=func))
    方式2:匿名函数
    salaries={'egon':3000,'alex':100000000,'wupeiqi':10000,'yuanhao':2000} #比较字典key的大小,如果是列表不是字典的话可以 print(max(salaries,key=lambda k:salaries[k])) print(min(salaries,key=lambda k:salaries[k]))

    匿名函数与其他函数的结合使用 

    l=[10,1,3,-9,22]
    l1=sorted(l,reverse=False)
    l1=sorted(l)
    print(l1)
    
    l2=sorted(l,reverse=True)
    print(l2)
    

    map 的工作原理(映射)

    names=['张明言','刘华强','苍井空','alex']
    
    # map的工作原理
    # 1 首先将可迭代对象变成迭代器对象
    # 2 res=next(可迭代器对象),将res当作参数传给第一个参数指定的函数,然后将该函数的返回值当作map的结果之一
    res=map(lambda x:x+"_SB",names)
    print(res)
    # print(list(res))
    print(res.__next__())
    

    fileter的工作原理(过滤)

    # filter的工作原理
    #1 首先将可迭代对象变成迭代器对象
    #2 res=next(可迭代器对象),将res当作参数传给第一个参数指定的函数,然后filter会判断函数的返回值的真假,如果为真则留下res
    names=['alexSB','egon','wxxSB','OLDBOYSB']
    print([name for name in names if name.endswith('SB')])
    aaa=filter(lambda x:x.endswith('SB'),names)
    print(aaa)
    print(list(aaa))
    

    内置函数

    稍后整理

  • 相关阅读:
    学习工具
    Qt 之 QApplication
    Qt中常用的类
    关于在Qt里让程序休眠一段时间的方法总结
    Qt setWindow setViewPort
    ajax回调数据 Structs has detected an unhandled exception 问题
    Struts2配置拦截器自定义栈时抛异常:Unable to load configuration.
    es6之map解构数组去重
    ES6之对象的方法
    ES6之genorator和yield使用(迭代器)
  • 原文地址:https://www.cnblogs.com/wangmiaolu/p/9157716.html
Copyright © 2020-2023  润新知