函数递归和匿名函数(它们的应用)
一、函数递归
函数递归调用(是一种特殊的嵌套调用):在调用一个函数的过程中,又直接或间接地调用了该函数本身
递归必须要有两个明确的阶段:
递推:一层一层递归调用下去,强调每进入下一层递归问题的规模都必须有所减少
回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推
开始一层一层回溯
递归的精髓在于通过不断地重复逼近一个最终的结果。
#直接调用本身 def f1(): print('from f1') f1() f1() #间接调用本身 def f1(): print('from f1') f2() def f2(): print('from f2') f1() f1()
eg1:取出下面列表中所有值
items=[1,[2,[3,[4,[5,[6,[7,[8,[9,[10,]]]]]]]]]]
def tell(l):
for item in l:
if type(item) is not list:
print(item)
else:
tell(item)
eg2:二分法:一个从小到大排列的整型数字列表
l=[1,2,3,4,5,6,7,8,9,10,11]
def search(n,l):
print(l)
if len(l)==0:
print('not exist')
return
mid_index=len(l)//2
if n>l[mid_index]:
l=l[mid_index+1:]
search(n,l)
elif n<l[mid_index]:
l=l[:mid_index]
search(n,l)
else:
print('find it ')
search(2,l)
二、匿名函数
1.什么是匿名函数?
匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非让其有名字 func=lambda x,y,z=1:x+y+z func(1,2,3) #让其有名字就没有意义
2.与有名字函数区别
有名函数:循环使用,保存了名字,通过名字就可以重复引用函数功能 匿名函数:一次性使用,随时随时定义 应用:max,min,sorted,map,reduce,filter
3.内置函数