1、函数的递归调用
1.1、定义与使用
函数的递归调用:指的是在调用一个函数的过程中又直接或者间接地调用了自己
函数的递归调用就是一个循环的过程
一段代码的循环运行的方案有两种:
方式一(while、for循环):
while True:
print(1111)
print(2222)
print(3333)
方式二(递归的本质就是循环):
def f1():
print(1111)
print(2222)
print(3333)
f1()
f1()
需要强调的的一点是:
递归调用不应该无限地调用下去,必须在满足某种条件下结束递归调用
1.2、递归调用经历两个阶段
函数的递归调用:是函数嵌套调用的一种特殊形式
递归调用应该遵循的一个大前提是:必须在满足某种条件下结束递归调用,然后向上一层一层返回
递归调用经历两个阶段:
1、回溯:向下一层一层地调用
2、递推:在某一层终止调用,开始向上一层一层返回
age(5) = age(4) + 10
age(4) = age(3) + 10
age(3) = age(2) + 10
age(2) = age(1) + 10
age(1) = 18
def age(n):
if n == 1:
return 18
return age(n-1) + 10
res=age(5)
print(res)
1.3、递归的应用
l=[1,2,[3,[4,[5,[6,[7,[8,[9,10,11,[12,[13,]]]]]]]]]]
def f1(list1):
for x in list1:
if type(x) is list:
f1(x)
else:
print(x)
f1(l)
2、二分法
2.1、传统的方法(效率低)
nums = [-3, 1, 5, 7, 11, 13, 21, 37, 45]
find_num = 45
for num in nums:
if find_num == num:
print('找到啦')
break
else:
print("不存在")
2.2、二分法解决
nums = [-3, 1, 5, 7, 11, 13, 21, 37, 45]
find_num = 47
def search(find_num,nums):
print(nums)
if len(nums) == 0:
print('不存在')
return
mid_index = len(nums) // 2
if find_num > nums[mid_index]:
new_nums = nums[mid_index + 1:]
search(find_num,new_nums)
elif find_num < nums[mid_index]:
new_nums = nums[:mid_index]
search(find_num,new_nums)
else:
print("找到啦")
search(find_num,nums)
3、匿名函数
3.1、定义与使用
匿名函数:就是没有名字的函数
匿名函数只用于临时使用一次的场景
func=函数的内存地址
def func(x,y):
return x+y
print(func)
print(lambda x,y:x+y)
3.2、调用匿名函数的方式
res=(lambda x,y:x+y)(1,2)
print(res)
func=lambda x,y:x+y
res=func(1,2)
print(res)
总结:匿名用于临时调用一次的场景,更多的是将匿名与其他函数配合使用
3.3、匿名函数的应用
salaries = {
"allen": 3600,
"lily": 3000,
"lucy": 4000
}
def func(k):
return salaries[k]
res=max(salaries,key=func)
print(res)
res=max(salaries,key=lambda k:salaries[k])
print(res)
res=min(salaries,key=lambda k:salaries[k])
print(res)
res=sorted(salaries,key=lambda k:salaries[k],reverse=True)
print(res)