zoukankan      html  css  js  c++  java
  • 递归函数

    递归函数

    函数的递归:函数在调用阶段直接或间接的又调用自身

    # 补充知识
    import sys
    print(sys.getrecursionlimit())  # 查看python中最大递归次数,不是很准确
    sys.setrecursionlimit(2000)  #可以自定义最大递归次数
    
    # 实现递归调用,但是函数会无限制的递归下去,python解释器中有最大递归次数
    def func(n):
        print('from func',n)
        func(n+1)  # 查看递归调用次数
    func(1)
    
    # 实现了递归调用,但是函数会无限制递归下去。
    def index():
        print('from index')
        login()
        
    def login():
        print('from login')
        index()
        
    login()
    

    递归的两个阶段

    1,回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降。

    直到有一个最终的结束条件。

    2.递推:一次次往回推导的过程。

    age(5) = age(4) + 2
    age(4) = age(3) + 2
    age(3) = age(2) + 2
    age(1) = 18
    
    age(n) = age(n-1) + 2  # n > 1
    age(1) = 18  # n = 1
    
    # 使用递归函数实现找出第一个人的年龄
    def age(n):
        if n == 1:
            return 18
        return age(n-1)+2
    
    res = age(5)
    print(res)
    
    # 将列表中的数字依次打印出来(循环的层数是你必须要考虑的的点)
    s = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]
    
    def get_num(l):
        for i in l:
            if type(i) is int:
                print(i)
            else:
                get_num(i)
    
    get_num(s)
    

    递归函数不要考虑循环的次数,只需要把握结束的条件即可。

    # 补全函数语法的两种方式,一种是pass,一种是...。推荐使用pass
    def index():
        # pass
        ...
    

    利用递归实现二分法

    算法:解决问题的高效率的方法

    # 利用for循环找出num在列表中是否存在
    l = [1,3,5,12,67,58,125,145,156,178,203,234,367,278,342,422]
    num = 342
    for i in l:
        if i ==num:
            print(f'find it {i}')
        else:
            print('没找到')
    

    二分法

    二分法:容器类型里面的数字必须有大小顺序

    l = [1,3,5,12,67,58,125,145,156,178,203,234,367,278,342,422]
    target_num = 666
    def get_num(l,target_num):
        # 不在列表中
        if not l:
            print('你给的工资 这个任务怕是没法做')
            return
        # 获取列表中间的索引
        middle_index = len(l)//2
        print(l)
        # 判断target_num跟middle_index对应的数字的大小
        if target_num > l[middle_index]:
         	# 切取列表右半部分
            num_right = l[middle_index+1:]
            # 递归使用get_num函数
            get_num(num_right,target_num)
    
        elif target_num < l[middle_index]:
            # 切取列表左半部分
            num_left = l[:middle_index]
            # 再递归调用get_num函数
            get_num(num_left,target_num)
    
        else:
            print(f'find it {target_num}')
    
    get_num(l,target_num)
    
    

    三元表达式

    # 三元表达式固定表达式,可以连续多个三元表达式
    # 值1 if 条件 else 值2
    #	条件成立 值1
    #   条件不成立 值2
    
    
    x = 99999
    y = 999393993
    res = x if x > y else y
    print(res)  # 999393993
    
    
    x = 1
    y = 2
    m = 3
    n = 4
    res = x if x > y else (m if m > n else n)
    print(res)
    
    
    is_free = input('请输入是否免费(y/n)')
    is_free = '免费' if is_free == 'y'else '收费'
    print(is_free)
    
    
    username = input('username>>>>:')
    res = 'NB'if username == 'jaosn' else '垃圾'
    print(res)
    
    

    列表生成式

    l = ['tank','nick','oscar','sean']
    l1 = []
    for name in l:
        l1.append(f'{name}_sb')
        # l1.append('name_sb')  # 不推荐使用
    print(l1)  # ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']
    
    

    列表生成式

    l = ['tank','nick','oscar','sean']
    
    res = [f'{name}_DSB' for name in l ]
    print(res)  # ['tank_DSB', 'nick_DSB', 'oscar_DSB', 'sean_DSB']
    
    
    l = ['tank_DSB', 'nick_DSB', 'oscar_DSB', 'sean_DSB','jason']
    res = [name for name in l if name.endswith('_DSB')]
    print(res)  # ['tank_DSB', 'nick_DSB', 'oscar_DSB', 'sean_DSB']
    # 先for循环依次取出列表里面的每一个元素
    # 然后交由if判断,条件成立才会交给for循环前面的代码
    # 如果条件不成立,当前的元素,直接舍弃
    
    

    字典生成式

    # 生成字典
    l1 = ['name','password','hobby']
    l2 = ['jason','123','DBJ','egon']
    d = {}
    for i,j in enumerate(l1):
        d[j] = l2[i]
    
    print(d)  # {'name': 'jason', 'password': '123', 'hobby': 'DBJ'}
    
    
    # 字典生成式
    l1 = ['jason','123','read']
    d = {i:j for i,j in enumerate(l1) if j!='123'}
    print(d)  # {0: 'jason', 2: 'read'}
    # 字典生成式中可以加if判断,条件成立,就会添加到字典中,否则就不会添加
    
    
    # 集合生成式
    res ={i for i in range(10) if i!=4}
    print(res)  # {0, 1, 2, 3, 5, 6, 7, 8, 9}
    
    
    # # 这样写不是元组生成式 而是生成器表达式
    res1 = (i for i in range(10) if i!=4)
    print(res1)  # <generator object <genexpr> at 0x05B81230>  就是一只老母鸡
    for i in res1:
        print(i)  # 取出的鸡蛋 0,1,2,3,,5,6,7,8,9
    
    

    匿名函数

    匿名函数:没有名字的函数

    匿名函数的特点:临时存在,用完就没了。

    # 匿名函数lambda
    res = (lambda x,y:x+y)(1,3)
    print(res)  # 4
    
    
    # 不是匿名函数
    func = lambda x,y:x+y
    print(func(1,3))  # 4
    
    
    # lambda x,y:x+y
    # :左边的相当于函数的形参
    # :右边的相当于函数的返回值
    
    

    匿名函数通常不会单独使用,是配合内置函数一起使用。

    常用的内置函数

    1,max(l,key=),min(l,key=)函数

    l = [1,2,3,4,5]
    print(max(l)) # 内部是基于for循环的
    
    
    A-Z在ascii码中的序号是65-90
    a-z在ascii码中的序号是977-122
    
    
    d = {
        'egon':30000,
        'jason':888888,
        'nick':3000,
        'tank':1500,
    }
    def index(name):
        return d[name]
    # 比较薪资,返回人名
    print(max(d,key=lambda name:d[name]))  # jason
    # lambda name:d[name] 将名字当做参数传入,返回的是以名字取到的薪资,比较的是薪资大小,最终返回的是人名
    print(min(d,key=lambda name:d[name]))  # tank
    
    

    map(func,iter)映射,将新的值与原来的值一一对应替换

    l = [1,2,3,4,5,6]
    print(list('hello'))
    print(list(map(lambda x:x+5,l)))  # [6, 7, 8, 9, 10, 11]
    
    

    zip(iter1,...) 拉链函数

    l1 = [1,2]
    l2 = ['jason','nick','tank']
    l3 = ['a','b','c']
    print(list(zip(l1,l2,l3)))  # [(1, 'jason', 'a'), (2, 'nick', 'b')]
    
    

    zip()拉链函数,可以用来生成字典,

    filter() 过滤

    l = [1,2,3,4,5,6]
    print(list(filter(lambda x:x!=3,l)))  # [1, 2, 4, 5, 6]
    
    

    sorted() 排序

    l = ['jason','egon','nick','tank']
    print(sorted(l,reverse=True))  # ['tank', 'nick', 'jason', 'egon']
    
    

    reduce() 缩减为一个值

    from functools import reduce
    l = [1,2,3,4,5,6]
    print(reduce(lambda x,y:x+y,l,19))
    # 当初始值不存在的情况下,按照下面的规律
    # 第一次先获取两个元素 相加
    # 之后每次获取一个与上一次相加的结果再相加
    
    
    Never,Never,Never give up.
  • 相关阅读:
    Spring AOP 随记
    Java设计模式系列 — 构造器模式
    【Java线程安全】 — 常用数据结构及原理(未完结)
    【最佳实践】好用的Quartz管理器类
    Timer和时间调度
    Java9之HashMap与ConcurrentHashMap
    记一次maven的包冲突经历
    hbase高可用集群部署(cdh)
    HBase 1.2.6 完全分布式集群安装部署详细过程
    hadoop-2.7.3完全分布式部署
  • 原文地址:https://www.cnblogs.com/zuihoudebieli/p/11182045.html
Copyright © 2011-2022 走看看