Loading

递归、二分法、三元表达式、生成式

1.递归

  • 什么是递归

函数在运行过程中直接或者间接调用自身

  • 递推
    一层一层往下推导答案(前提是递归之后的复杂度相较于上一次的要有所下降)
  • 回溯
    依据最后的结论往后推导出自己最初需要的答案

递归一定要有结束条件

# 官网表示:python默认的最大递归深度为1000次
# import sys
# print(sys.getrecursionlimit())
# print(sys.setrecursionlimit(2000))
count = 1
def index():
    global count
    count += 1
    print(count)
    print('from index')
    index()
index()

# def func():
#     print('from func')
#     index()
# def index():
#     print('from index')
#     func()
# index()
例一:年龄问题
# 伪代码:可能无法运行 但是可以表述逻辑
# age(5) = age(4) + 2
# age(4) = age(3) + 2
# age(3) = age(2) + 2
# age(2) = age(1) + 2
# age(1) = 18

# def get_age(n):
#     if n == 1:
#         return 18
#     return get_age(n - 1) + 2
# print(get_age(5))
例二:打印问题
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,]]]]]]]]]]]]]]
要求:打印出列表中每个元素(列表除外)

思路:
1.循环该列表获取列表中每一个元素
2.判断每一个元素是否为数字 如果是数字 则打印
			如果是列表 则获取列表内的每一个元素
3.判断每一个元素是否为数字 如果是数字 则打印
			如果是列表 则获取列表内的每一个元素
			

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

2.算法之二分法

  • 什么是算法

算法是高效解决问题的方法

  • 什么是二分法

首先二分法使用的环境是有序的(升序/降序都行)
然后利用区间中间值与目标对象进行对比,折半

l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]
def my_func(target_num,l):  # 定义一个函数
	# 判断一下列表是否是空列表
	if len(l) == 0:
		print('目标为空列表,无法匹配数据')
		return
	# 利用取整,获取一下中间位置索引
	mid_dex = len(l) // 2
	if target_num < l[mid_dex]:
		l_left = l[:mid_dex]
		print(l_left)  # 纯粹是为了看过程效果
		my_func(target_num,l_left)
	elif target_num > l[mid_dex]:
		l_right = l[mid_dex+1:]
		print(l_right)
		my_func(target_num,l_right)
	else:
		print('找到了',target_num)
		
# my_partner(444, l)  找不到 需要添加结束条件
# my_partner(11, l)  # 要查找的元素在开头  那么还没有依次查找的效率高

3.三元表达式

比较大小,二选一的情况下
正常比较
def my_max(a,b):
	if a > b:
		return a
	return b  # 前提是a != b

三元表达式
def my_max(a,b):
	return a if a > b else b
# if条件成立采用if前面的值,if不成立采用后面的值
# 三元表达式尽量不要嵌套使用,虽说可以


is_free = input('电影是否需要收费(y/n)>>>').strip()
if is_free == 'y':
	print('收费')
else:
	print('免费')
	
is_free = input('电影是否需要收费(y/n)>>>').strip()
print('收费' if is_free == 'y' else '免费')

4.生成式

name_list = ['jason', 'kevin', 'tony', 'jerry']
# 要求:给列表中每个元素添加一个_DSB的后缀,其中jason不加
通常做法
new_list = []
for i in name_list:
	if i == 'jason':
		continue
	else:
		new_name = i.join('_DSB')
		new_list.append(new_name)
print(new_list)

列表生成式
[通过条件判断之后的变量名 for 变量名 in 可迭代对象 if 条件]
name_list = ['jason', 'kevin', 'tony', 'jerry']
res = [i.join('_DSB') for i in name_list if i != 'jason']
print(res)

字典生成式
l1 = ['name','age','hobby']
l2 = ['alan',18,'read']
# 将两个元组用字典对应起来
new_dict = {}
for i in range(len(l1)):
	new_dict[l[i]] = l2[i]
print(new_dict)

list_info = [('name','alan'),('age',18),('hobby',read)]
dic_info = {k:v for k,v in list_info}
print(dic_info)

有if的字典生成式
lis_info = ['alan','alearn','tony','tom']
# 利用枚举的方法,获取字典的k,当遇见alearn时,跳过
dic_info = {k:v for k,v in enumerate(lis_info) if v!='alearn'}
print(dic_info)
# {0: 'alan', 2: 'tony', 3: 'tom'}

# enumerate 针对for循环使用,每次产出两个结果,默认从0开始,可以通过start修改其实位置参数

迭代器
name_list = ['alan', 'alearn', 'tony', 'tom']
res1 = {i for i,j in enumerate(name_list)}
print(res1,type(res1))

res2 = (i for i,j in enumerate(name_list))
print(res2)

# {0, 1, 2, 3} <class 'set'>
# <generator object <genexpr> at 0x0000011B4B0F0BA0>
posted @ 2021-12-01 10:17  爱learn  阅读(21)  评论(0编辑  收藏  举报