zoukankan      html  css  js  c++  java
  • 函数(三)

    函数递归

    1.什么是函数递归。

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

    2.怎么用递归

    例子:

    直接递归:

    def func(n):
        print('from func',n)
        func(n+1)
    func(1)

    补充:

    import sys
    sys.setrecursionlimit(2000)#能够让递归深度变得更大

    递归深度一般为 997 或者 998 之间  

    间接递归:

    def index():
        print('from index')
        login()
    
    def login():
        print('from index')
        index()
    
    login()

    函数递归,跟使用for 循环 ,while 循环有些形式上差不多,但是递归能做一些循环语句做不了的事情

    有一个重要的一点:函数递归,每次调用自身都会在内存空间开辟出一个额外的内存空间,因此当函数无限制的递归下去,就会非常的浪费内存。而for,while循环时,他们的无限循环仅仅在自身开辟出的空间里执行,不会浪费非常多的空间。因此函数递归就会有递归深度限制出现,防止内存爆炸。

    递归分为两个阶段

      1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降,直到有一个最终的结束条件

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

    下面举两个具体的例子:

    一:知道第一个人的年龄为18,每一个人是比前一个人年龄大两岁,用递归写出第五个人的年龄:

    def age(n)
        if n == 1:  #必须要有结束条件
            return 18
        return age(n-1) + 2
    res = age(5)
    print(res)

    二:l = [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:
                return get_num(i)
    
    get_num(l)
    def fun(l):
        print(l[0])
        if len(l) > 1:
            fun(l[1]

    算法之二分法

    现在有一个列表 l = [1,3,5,12,57,89,101,123,146,167,179,189,345]  

    我想找出其中有没有189这个数,我们会怎么做。

    1.循环判断

    for i in l:
        if i == 189:
            print('find it')

    那么如果这个列表特别长,而且我要判断的数在最后面,那我们是不是要把这个列表所有数都要遍历一遍这样太浪费时间了。那么为了节省时间我们就可以用二分查找算法来做。

    首先:二分查找算法有个特定的要求 , 查找的内容必须是有顺序的

    target_num = 189
    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)

    三元表达式

    三元表达式固定的表达式格式

      值1  if条件 else 值2

        条件成立  值1

        条件不成立   值2

    1.普通写法:

    def my_max(x,y):
        if x > y:
            return x
        else:
            return y

    2.三元表达式写法:

    res = x if x > y else y

    三元表达式的应用场景只推荐只有两种的情况的可能下

    列表生成式

    现在有一个列表 l =['tank','nick','oscar','sean'] 在列表中每个元素的后面加上_sb

    l1 = []
    for name in l:
        l1.append('%s_sb'5name)
    print(l1)

    列表生成式的写法:

    res = ['%s_sb'%name for name in l]
    print(res)

    若现在有列表l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB'],取出元素后有_sb的元素

    res = [name for name in l if name.endswith('_sb')]

    字典生成式

    l1 = ['name','password','hobby']
    l2 = ['jason','123','DBJ']
    
    dic = {l1[i]:l2[i] for i in range(len(l1))}
    print(dic)
    
    #{'name': 'jason', 'password': '123', 'hobby': 'DBJ'}

    匿名函数

    见名思意就是没有名字的函数,其特点:l临时存在用完就没了

    def my_sum(x,y):
        return x+y
    
    #匿名函数写法
    res = (lambda x,y:x+y)

    匿名函数中  :左边的相当于函数的形参

          :右边的相当于函数的返回值

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

    万般皆下品,唯有读书高!
  • 相关阅读:
    Go-结构体,结构体指针和方法
    jpa报错object references an unsaved transient instance
    vue的$nextTick
    springboot里面的缓存注解
    X linux上安装sql developer
    X Oracle中RegExp_Like 正则表达式基本用法
    X Linux 安装MySql启动Can't locate Data/Dumper.pm in @INC
    X Centos7下NFS服务器搭建及客户端连接配置
    X grid安装前检查报PRVE-0426:/dev/shm less than the require
    1743. 从相邻元素对还原数组 力扣每日一题2021/7/25
  • 原文地址:https://www.cnblogs.com/s686zhou/p/11176296.html
Copyright © 2011-2022 走看看