Day07 -函数递归
函数递归调用:是函数嵌套调用的一种特殊形式
具体指的是:在调用一个函数的过程中有直接或间接地调用到本身
递归层级最大1000层,可以设置更大但不建议
import sys
sys.getrecursionlimit()#查看
sys.setrecursionlimit(num)#设置
#调用本身
def f1():
print('是我是我还是我')
f1()
f1()
#间接调用
def f1():
print('f1>>>>')
f2()
def f2():
print('f2>>>>')
f1()
f1()
需要的强调的是:尾递归优化(pyton没有)
递归不应该无限的调用,必须在满足某种条件下结束递归调用(用return)
1.递归的两个阶段
1.1 回溯
一层一层调用下去
1.2 递推
满足某种结束条件,结束递归调用,然后一层一层返回
def age(n):
if n==1:
return 18
return age(n-1)+10
#递归的应用
l=[1,[2,[3,[4,[5,[6,[7,[8,[9,10,11]]]]]]]]]
def func(n):
for x in n:
if type(x) is list:
func(x)
else:
print(x)
func(l)
2.二分法(有序列表)
无序列表可以用num.sort()排序
#原始
num=[-3,4,5,30,13,42,53,65,77,98]
find_num=13
for nums in num:
if nums==find_num:
print('find it')
break
def binarry_search(find_num,num):
print(num)
if len(num)==0:
print('值不存在')
return
mid_index=len(num)//2
mid_val=num[mid_index]
if mid_val < find_num:
num=num[mid_index+1:]
binarry_search(find_num,num)
elif mid_val > find_num:
num=num[:mid_index]
binarry_search(find_num,num)
else:
print('find it')
if __name__ == '__main__':
num=[-3,4,5,30,13,42,53,65,77,98]
find_num=9
binarry_search(find_num,num)
3.面向过程的编程思想
核心是"过程"二字,指的是做事的步骤:先什么、在什么、后干什么
基于该思想就好比设计一条流水线
优点:
- 复杂的问题流程化、进而简单化
缺点:
- 扩展性差
1.不是所有的软件都需要频繁更迭。比如:编写脚本
2.即便是一个软件需要频繁更迭,也不代表这个软件所有组成部分都需要一起更迭
4.函数式
4.1匿名函数lambda
匿名函数用于临时调用一次的场景:更多的是将匿名与其他函数配合使用
lambda x,y : x+y#只是定义了
#调用匿名函数,内存地址加()
#方法一
res=(lambda x,y : x+y)(1,2)
print(res)
#方法二
f=(lambda x,y : x+y)
res=f(1,2)
print(res)
##########################################
#应用
salaries={
'siry':3000,
'tom':7000,
'lili':10000,
'jack':2000
}
#max和min(可迭代对象,key=函数式)和sorted()函数一样
res=min(salaries,key=lambda k:salaries[k])
print(res)
res=max(salaries,key=lambda k:salaries[k])
print(res)
4.2 map(映射)
map(函数,可迭代对象)
l=['alex','lxx','wxx','Lee']
new_l=[name+'_dsb' for name in l ]
print(new_l)
new_l=map(lambda name: name+'_dsb',l)
print(next(new_l))
print(next(new_l))
print(next(new_l))
print(next(new_l))
4.3 filter(过滤)
l=['alex_sb','lxx_sb','wxx','Lee']
new_l=[i for i in l if i.endswith('sb')]
print(new_l)
new_l=filter(lambda name:name.endswith('sb'),l)
print(new_l)
4.4 reduce
py2内置;py3在functools库中
累加操作
from functools import reduce
res=reduce(lambda x,y:x+y,[1,2,3,4,5,6],10)
print(res)
res=reduce(lambda x,y:x+y,l)
print(res)