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

    1.函数的递归

      指一个函数在内部调用的阶段直接或者间接的调用了自身并且,return语句不能包含表达式。

    递归分为两个阶段
      1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降
    直到有一个最终的结束条件
      2.递推:一次次往回推导的过程

    '''
    age(4)=age(3)+1
    age(3)=age(2)+1
    age(2)=age(1)+1
    age(1)=1
    可找出规律:
    age(n)=age(n-1)+1   n>1时成立 
    age(1)=1
    '''
    #递归函数
    del age(n):
        if n == 1    #必须要有结束条件4
            return 1
        return age(n-1)+1
    res = age(4)
    print(res)  #递归函数不要考虑循环的次数 只需要把握结束的条件
    l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]],将列表中的数字依次打印出来
    def num(l):
        for i in l:
            if type(l) is int:
                print(i)
            else:
                 num(i)    
    num(l)    #用for循坏来打印的话,代码就比较繁琐
    # 递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰,代码也不如递归的可读性高。

    顶替方法:①第一种是pass,②第二种是...。推荐使用第一种。

    2.算法之二分法

      前提:容器里面的数组一定要是有顺序的。

      基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。

    l = [1,3,5,12,57,89,101,123,146,167,179,189,345]
    target_num = 666        #target_num 目标编号
    def get_num(1,target_num):
        if not =1:
            print('该数字不存在!')
            return
        print(l)  
        middle_number = len(l)//2      #中间索引
        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)

    3.三元表达式

    比较x和y的大小。
    #用函数来表示
    def my_max(x,y)
        if x > y:
            return:x
        else:
            return:y
    #当某个条件成立时做一件事,不成立时做例外一件事。
    #比如当x大的时候返回x,当y大的时候返回y。
    
    #用三元表达式来表达
    res = x   if x > y else  y     #如果if后面的条件成立返回if前面的值 否则返回else后面的值
    三元表达式固定表达式
       值1  if  条件  else 值2
            条件成立 :   值1
            条件不成立: 值2

    补充:三元表达式的应用场景只推荐只有两种选择的情况下使用。

    4.列表生成式

    #往列表里面的内容增加一个尾注
    #for循环添加方法
    l=['1','2','3','4','5','6']
    li=[]
    for name in l:
        li.append('%s_nb'%name)
    print(li)
    # 列表生成式
    res = ['%s_nb'%i for i in l]
    print(res)
    l = ['1_nb', '2_nb', '3_nb', '4_nb','6_dnb'],将含有‘_nb’的另外组成一个列表。
    res=[name for name in l if name.endswith('_nb')] #后面不支持else,因为else可以与for,if都有关联。
    print(res)     #['1_nb', '2_nb', '3_nb', '4_nb', '5_nb']
    # 先for循环依次取出列表里面的每一个元素
    # 然后交由if判断  条件成立才会交给for前面的代码
    # 如果条件不成立 当前的元素 直接舍弃

    5.字典生成式

    跟列表生成式一样,字典生成式用来快速生成字典,不同的是,字典需要两个值。

    #d = {key: value for (key, value) in iterable}
    d1 = {'x': 1, 'y': 2, 'z': 3}
    d2 = {k: v for (k, v) in d1.items()}
    print(d2)

    6.匿名函数

    特点:一般都是临时存在,用完就没了。 

    def my_sum(x,y)
        return x + y
    lambad x,y : x+y
    # 注:其中左边的相当于函数的形参,右边的相当于函数的返回值。
    # 匿名函数通常不会单独使用,是配合内置函数一起使用,也可以配合自己写的函数一起使用

     7.内置函数

    # map 映射   一一对应
    l = [1,2,3,4,5,6]
    print(list(map(lambda x:x+1,l)))  # 基于for循环
    >>>:[6, 7, 8, 9, 10, 11]
    
    
    # zip 拉链  # 基于for循环,只顾及短的那一端
    l1 = [1,2,]
    l2 = ['a','b','c']
    print(list(zip(l1,l2)))
    >>>:[(1, 'a'), (2, 'b')]
    
    
    # filter
    l = [1,2,3,4,5,6]
    print(list(filter(lambda x:x != 3,l)))     #>>>:[1, 2, 4, 5, 6]
    # 基于for循环,依次取出列表中的每一个值,取出来的值都放在lanbda中,其中(lambda)相当于一个条件,如果返回是false,那个值就不要。
    
    # reduce
    from functools import reduce
    l = [1,2,3,4,5,6]
    print(reduce(lambda x,y:x+y,1))    #>>>:21
    当初始值不存在时,先获取取两个元素相加值,之后每次获取一个与上一次相加的结果相加

     

  • 相关阅读:
    js获取上一个兄弟元素
    js验证身份证
    github绑定自己的域名
    vue子组件传参给父组件
    vue父组件传参给子组件
    运行vue init webpack vueTest时报错
    运用CSS高斯模糊添加图片加载效果
    分享记录一批免费VIP视频解析接口,不定时更新!
    收藏的一些有意思的CSS加载样式
    一款很好用的页面滚动元素动画插件-AOS.JS
  • 原文地址:https://www.cnblogs.com/blue-tea/p/11178085.html
Copyright © 2011-2022 走看看