zoukankan      html  css  js  c++  java
  • 函数递归 三元表达式 匿名函数 函数内置方法

    递归函数

    定义:任何函数在调用自己的情况下 就叫递归  函数在调用的时候可以直接性或者间接性的调用自己.但是他不能无限制的调用下去 也不应该无限制的调用下去

    递归分为两个阶段,递推和 回溯 (回溯就像while循环一样一直重复下去 但是每一次重复 都要建立在上一次循环的基础上 减小目标难度)

                                                                      递归的递推:递归每一次都是基于上一次进行下一次的执行。

                                                                      递归的回溯:当遇到终止条件,则从最后往回一级一级的把值返回来。

                                                                      递归函数调一般 用自身去解决一个规模比原始问题要小一些的问题。

        一个简单的递归 因为说过函数不能无限的递归小下去 所以 他的范围在 997-998之间

    下面是一个回溯和递推的展示:

    def age(n):
        if n == 1:
            return 18
        return age(n-1) + 2
    print(age(5))

    #age(5) = age(4) +2    第一次进入

    #age(4) = age(3) +2    第二次进入

    #age(3) = age(2) +2    第三次进入

    #age(2) = age(1) +2    第四次进入

    #age(1) = 18          第五次进入,此时达到结束的条件,递归终止

    这是一个典型的递归递推算法,它的每一次执行都是基于上一次的结果。

    总结:递归必须要有一个明确的结束条件, 否则就变成死循环导致栈溢出,以上两例都是以“if”语句作为结束条件的。每递归一次要解决一些事情,否则就失去了递归的意义。

    算法之二分算法:什么是算法 算法就是一个可以提高解决问题效率的方法 

            二分算的就是 快速寻找你想在一个容器类型里寻找的值 容器里面必须有大小顺序 假如你想寻找一个列表里的值 可以使用for循环的遍历来实现 但是效率太慢

    就好比说我想在一个 有10000个数字的列表里找最后一个数字 那么就需要循环10000次 这样就需要用到二分算法

    l = [1,3,5,12,57,89,101,123,146,167,179,189,345]
    
    target_num = 666
    
    def get_num(l,target_num):
        if not l:
            print('不在数字内')
            return
        # 获取列表中间的索引
        print(l)
        middle_index = len(l) // 2
        # 判断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[0:middle_index]
            # 再递归调用get_num函数
            get_num(num_left, target_num)
        else:
            print('find it',target_num)
    
    get_num(l,target_num)

    三元表达式 其实就是把很简单的逻辑判断 不值得写那么多行的if else 简化成一行  固定表达方式 :

    三元表达式固定表达式
        值1 if 条件 else 值2
            条件成立 值1
            条件不成立 值2

    列表生成式:列表生成式作用是用来生成列表的,那么其特点也肯定是使用“[]”来去表示的 也是把简单的代码写成一行例子:

    假如我们这里需要创建一个列表 和a列表对比 如果在a里面 我们打印他

    他其实就相当于:

    a=[1,2,5,7]
    for b in list(range(1,10)):
        if b in a:
            print(b)

    补充
    # 先for循环依次取出列表里面的每一个元素
    # 然后交由if判断 条件成立才会交给for前面的代码
    # 如果条件不成立 当前的元素 直接舍弃

    同样 集合也可以这样使用:

    res = {i for i in range(10) if i != 4}
    print(res)

    但是使用()号的话返回的不是元组 而是一个地址 叫生成器 需要用for循环来打印

    res1 = (i for i in range(10) if i != 4)  # 这样写不是元组生成式 而是生成
    
    print(res1)
    for i in res1:
        print(i)

    字典也可以这样使用:

    l1 = ['name','password','hobby']
    
    d = {i:j for i,j in enumerate(l1) if j != '123'}
    
    返回的是一个字典 {index:他的一个值}

    匿名函数:没有名字的函数 主要起到临时存在.用lambda  

    func = lambda x,y:x+y
    print(func(1,2))

    也可以直接传值
    res = (lambda x,y:x+y)(1,2)
    print(res)
    # :左边的相当于函数的形参 # :右边的相当于函数的返回值 # 匿名函数通常不会单独使用,是配合内置函数一起使用

    常用的内置函数

    max() 求最大值 内部是基于for循环  min() 求最大值 内部是基于for循环

    chr ()查看数字对应的 A-Z a-z

    map() 映射 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回

    zip 拉链 基于for循环 把两个 不同的列表 都一一对应的放在一个元组里面 最后打包成一个列表 元组个数取决于 最短的那个列表

    stored() stored(列表 , reverse=True) 给列表排序 

    from functools import reduce

    from functools import reduce
    l = [1,2,3,4,5,6]
    print(reduce(lambda x,y:x+y,l,19))  # 19初始值  第一个参数
    # 当初始值不存在的情况下 按照下面的规律
    # 第一次先获取两个元素 相加
    # 之后每次获取一个与上一次相加的结果再相加
    趁自己还没死 多折腾折腾
  • 相关阅读:
    2020 camp day0 -F
    2020 camp day2 -k
    扫描线 hdu1542
    Assign the task HDU
    快速排序模板
    Java中Thread的常用方法
    Java中多线程的创建
    二分模板
    main()的简单理解
    单例模式饿汉式和懒汉式的实现
  • 原文地址:https://www.cnblogs.com/lddragon/p/11179204.html
Copyright © 2011-2022 走看看