首页 > 其他分享 >递归函数以及其他了解知识

递归函数以及其他了解知识

时间:2023-06-01 21:12:22浏览次数:28  
标签:name 递归函数 res 知识 list 列表 了解 print else

递归函数

什么是递归函数?
'''递归就是直接或者间接使用自己的函数就是递归函数,执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出。'''

递归函数分为两个阶段:
1、递推:由外向内的一个过程
2、回溯:从内向外的一个过程

# 练习题:
l = [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13]]]]]]]]]]]]]
# 给打印出列表中的所有元素值,只打印除列表之外的元素,如果是列表不打印
"""
    循环打印:
    1. 判断元素是不是列表,如果是列表不打印,如果不是列表则打印
    2. 继续判断,元素是不是列表,如果不是则打印,如果是,不在打印
    3. 继续循环,判断元素是不是列表,如果不是,则打印,如果是,不打印
    4. 继续循环...
"""


# for i in l:
#     # 判断是不是列表
#     if type(i) is int:
#         print(i)
#     else:
#         # 说明是列表
#         # 继续循环
#         for j in i:
#             # 判断j是不是列表
#             if type(j) is int:
#                 print(j)
#             else:
#                 # 说明是列表
#                 # 继续循环
#                 for k in j:
#                     # 判断k是不是列表
#                     if type(k) is int:
#                         print(k)
#                     else:
#                         ...

# 使用递归函数:

def get_num(l):
    for i in l:
        if type(i) is int:
            print(i)
        else:
            get_num(i)


get_num(l)

算法之二分法

什么是二分法?
'''
二分法:也称折半搜索、对数搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
'''
# 二分查找法
l = [2, 3, 11, 23, 34, 44, 45, 55, 56, 66, 67, 77, 88, 99, 100]

# 在列表中找66是否有
1. for循环遍历
for i in l:
    if i == 66:
        print("找到了")
        # for 循环确实可以做到但是需要一直遍历到66的位置才可以找到
        
2. 二分法实现
	'''算法不一定都是比其他方法高效的'''
    
l = [11, 2, 3, 44, 55, 66, 77, 88, 99, 100, 23, 34, 45, 56, 67,101]
l.sort()  # 对列表进行排序
print(l)
print(len(l))
digit = 66  # 定义一个目标数据


def index(digit, l):
    if len(l) == 0:  # 判断列表是否为空
        print('没有要查找的信息')
        return
    midfill = len(l) // 2  # 对列表长度进行整除,找到中间值
    if digit > l[midfill]:  # 说明目标数据在列表右边
        l_digit = l[midfill + 1:]
        print(l_digit)
        index(digit, l_digit)
    elif digit < l[midfill]:  # 说明目标顺序在列表左边
        l_digits = l[:midfill]
        print(l_digits)
        index(digit, l_digits)
    else:
        print('找到了')


index(digit, l)


# 冒泡排序、快排、插入等

三元表达式

# 三元表达式
def index(a, b):
    if a > b:
        return a
    else:
        return b


print(index(1, 2)) # 2


# 简化版
def index(a, b):
    return a if a > b else b


res = index(3, 4)
print(res) # 4
"""
	语法结构:
		条件成立返回if前面的值 if 条件 else 条件不成立返回else后面的值
    
"""

"""三元表达式的使用场景:只有当需求功能是二选一的情况下,才使用三元表达式"""

# res = '干饭' if 2 > 1 else '不干饭'
# print(res)

# res1 = '明天出去玩' if True else '在家学习'
# print(res1)


# cmd = input('请问你是否喜欢学习:(y/n)')
# if cmd == 'y':
#     print('学习使我快乐')
# else:
#     print('天天就知道学习')

# res = '学习使我快乐' if cmd == 'y' else '天天就知道学习'
# print(res)

# 他还可以支持嵌套
is_beautiful = True
res = '干饭' if 1 > 2 else '学习' if False else '喜欢' if is_beautiful == True else '不喜欢'
print(res)

"""
    一般情况我们在写代码的时候,尽量不要使用嵌套的情况
    但是,嵌套的是一般出现在面试题里面
"""

列表生成式

name_list = ['kevin', 'tank', 'tony', 'jerry']
# 1. 给列表中的所以名称加一个后缀_DSB
# 2. 定义一个空列表用来存储拼接之后的值
new_name_list = []

# 3. 循环列表
for name in name_list:
    # res = '%s_DBS' % name
    # res = name +'_DSB'
    new_name_list.append('%s_DBS' % name)

print(new_name_list)

# 列表生成式
res = [name+'_DSB' for name in name_list]
print(res)

# 2. 定义一个空列表用来存储拼接之后的值
new_name_list = []

name_list = ['kevin', 'tank', 'tony', 'jerry']

# 2.1、 给列表中的所有名称都加一个后缀_DSB, 除了jerry不加
for name in name_list:
    if name != 'jerry':
        new_name_list.append('%s_DSB' % name)

print(new_name_list)

# 列表生成式
# res = ['%s_DSB' % name for name in name_list if name != 'jerry']
res = ['%s_DSB' % name if name != 'jerry' else name  for name in name_list]
print(res)

其他生成式(了解)

l = ['name', 'age', 'gender']
l1 = ['kevin', 18, 'male']

# 组织成:{'name':'kevin', 'age':18, 'gender':'male'}
# 1. 定义一个空字典
new_dict = {}
for i in range(3):
    new_dict[l[i]] = l1[i]
print(new_dict)  # {'name': 'kevin', 'age': 18, 'gender': 'male'}

"""
补充一个方法:enumerate
    1. 循环enumerate方法可以得到两个值
        索引、元素
    
"""
for i, j in enumerate(l, start=2):
    print(i, j)

# 字典生成式
res = {i: j for i, j in enumerate(l) if j != 'name'}
print(res)

# 集合生成式
res = {i for i, j in enumerate(l)}
print(res)

# 元组
res1 = (i for i in enumerate(l))  # 生成器
print(res1)

匿名函数

"""没有名字的函数"""
之前使用def关键字定义的函数都是有名函数,有名字的函数

"""
语法格式:
	lambda 形参:返回值
"""

res1 = lambda x: x + 1
print(res1(2))  # 3


def index(x):
    return x + 1


print(index(1))  # 2

res = lambda x: x + 1
res(1)
print(res(1))  # 2
print((lambda x: x + 1)(2))  # 3

匿名函数的内置方法

# 有什么使用场景:他一般不会单独使用,会配合几个常见的内置函数使用

############## map()

l = [1, 2, 3, 4, 5, 6]

def index(x):
    return x + 1

res = map(index, l)  # 底层就是for循环
print(list(res))  # [2, 3, 4, 5, 6, 7]

# 使用匿名函数
res = map(lambda x:x+1, l)  # 底层就是for循环
print(list(res))  # [2, 3, 4, 5, 6, 7]

############## zip()


l1 = [1, 2, 3, 4, ]
l2 = ['a', 'b', 'c', 'd']
lst = []
for i in range(len(l1)):
    lst.append((l1[i], l2[i]))

print(lst) #[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]

# 匿名函数

l1 = [1, 2, 3, 4, ]
l2 = ['a', 'b', 'c', 'd']
l3 = ['aa', 'bb', 'cc','dd']
l4 = ['aaa', 'bbb', 'ccc', 'ddd', 'eee']
res=zip(l1, l2, l3, l4)  # 拉链 # [(1, 'a', 'aa', 'aaa'), (2, 'b', 'bb', 'bbb'), (3, 'c', 'cc', 'ccc'), (4, 'd', 'dd', 'ddd')]
print(list(res))

############## max min

l1 = [1, 2, 3, 4, 5]
print(max(l1))  # 5
print(min(l1))  # 1
s = ['kevin', 'tank', 'jerry']
print(max(s))  # tank

d = {
    'kevin': 2000,
    'tank': 1000,
    'oscar': 300000,
}
print(max(d)) # tank
# 如果想比较字典v值的大小该如何比较呢?

d = {
    'kevin': 2000,
    'tank': 1000,
    'oscar': 300000,
}

def index(key):
    return d[key]


print(max(d, key=index))  # oscar
print(min(d, key=lambda key: d[key]))  # tank

# 这时候就是比较v值的大小了

############## filter 过滤

ll = [11, 22, 33, 44, 55]
ls = []
for i in ll:
    if i > 30:
        ls.append(i)
print(ls)

# 匿名函数:
res = filter(lambda key: key > 30, ll)
print(list(res))

标签:name,递归函数,res,知识,list,列表,了解,print,else
From: https://www.cnblogs.com/chao0308/p/17450224.html

相关文章

  • 通过实例了解vue3.3更新的特征
    开场白5月份,vue团队发布了vue3.3.这次小版本的发布主要解决了--Vue与TypeScript一起使用时的许多长期存在的痛点.下面我们一起来学习一下vue3.3新特征准备新新特征的环境根据官方团队的描述,我们需要准备一下工作。vue升级到3.3时,建议同时更新以下依赖项:Volar/vue......
  • Java 基本知识——first day
    注释注释不会被执行,是写给看代码的人看的。三种注释单行注释多行注释文档注释标识符关键字Java常见的关键字考点总结四个点:首字母应该以字母、$、_开始;开始后可以任意字符;不可用关键字大小写敏感 数据类型Java是一门强类型语言强类型语言比如......
  • MYSQL知识点汇聚
    MySQL社区版下载地址:http://dev.mysql.com/downloads/第二版MYSQL视频教程:http://php.itcast.cn/news/20130617/17423736508.shtmlMYSQL优化视频教程:http://php.itcast.cn/news/61ee8515/a34e/477d/9d5d/662dbff5e161.shtml 1、MYSQL如何设置大小写敏感写道1、linu......
  • 上万条美容知识大全ACCESS\EXCEL数据库
    今天采集了一个美容知识大全的网站,网站里的内容主要是美容化妆类的文章,分类有近百个,是个可以受女生喜欢的内容。截图包含所有字段。分类统计情况为:瘦腿方法(793)、美白(615)、瘦腰(583)、上班族(472)、抗衰老(453)、男士美容(421)、瘦脸(355)、翘臀(345)、防晒(256)、瘦臂(244)、补水(241)、保湿(229)、......
  • 直播app源码技术开发知识:横竖屏功能的实现
    在快节奏时代的今天,直播短视频日益火爆,许多人选择去进入直播短视频源码搭建平台的行业,去开发制作自己的直播短视频app平台。当然,要开发制作自己的直播短视频app平台就要去顺应市场的需要,将用户们所需要的和市场各大app好的功能都要添加到自己的app中,不知道大家有没有发现这么一个功......
  • 唯一客服 -基于ChatGPT和私有数据构建智能知识库和个性化AI
    基于ChatGPT和私有数据构建智能知识库和个性化AI1.注册开通2.上传文档3.智能助理更智能,基于ChatGPT大模型算法,回答准确,逻辑清晰更安全,支持私有化部署,文档数据本地化,安全可控更全面,可用于企业AI客服,企业内部知识查询&经验分享,员工自助服务,赋能企业外部合作伙伴、个人知识库等......
  • 【博学谷学习记录】超强总结,用心分享 | spark知识点总结2
    【博学谷IT技术支持】Action动作算子reduce:通过func函数聚集RDD中的所有元素,这个功能必须是可交换且可并联的collect:在驱动程序中,以数组的形式返回数据集的所有元素count:返回RDD的元素个数first:返回RDD的第一个元素(类似于take(1))take:返回一个由数据集的前n个元......
  • JDK 8 新特性:构造器引用(了解)
       ......
  • 递归函数
    聊聊递归函数和二分法递归函数什么是递归函数? """递归就是直接或者间接调用自己的函数就是递归函数"""递归函数的优点和缺点优点:-可以简化代码,使程序更加简洁。-可以解决一些复杂的问题,比如数学上的阶乘、斐波那契数列等。缺点:-可能会导致栈溢出,因为每次调用函......
  • c语言值得注意的知识
    1.说明下列每对scanf格式串是否等价?如果不等价,请指出它们的差异。(c)"%f"与"%f "。在`scanf`函数中,`"%f"`和`"%f"`这两种格式的区别在于后面的空格。1.`scanf("%f",&variable);`这种情况下,`scanf`会读取并解析用户输入的浮点数,然后将解析的值存入`variable`中。......