函数递归
什么是函数递归:函数递归调用是一种特殊的函数嵌套调用,在调用一个函数的过程中,又间接或直接的调用了该函数本身
递归必须要有两个明确的阶段:
递推:一层一层递归调用下去,每进入下一层递归问题的规模必须有所减少
回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推,进行一层一层回溯
递归的精髓在于通过不断的重复逼近一个最终的结果
理论上来说递归能做的事情,循环都能够完成,那么为什么还要有递归这种机制呢,看了下面的例子有可能会使我们清晰点了。
例:在嵌套多层的列表中取出每一层列表中的值
l = [1,[2,[3,[4,[5,[7,[9,[8,[10,]]]]]]]]]
def tell(l):
for item in l :
if type(item) is list:
tell(item)#继续进入下一层递归
else:
print(item)
tell(l)
用递归实现二分查找(我们假设有一个从小到达排序好的列表,而且我们不知道 in 方法)
nums = [1, 3, 7, 11, 13, 22, 34, 55, 68, 99,123, 146, 155, 173, 189, 222, 235, 250, 265, 362, 456]
def search(search_num, nums):
print(nums)
if len(nums) == 0:
print('not exists')
return
mid_index = len(nums) // 2
if search_num > nums[mid_index]:
nums = nums[mid_index+1 : ] #被找的数处于二分之后列表中的右侧
search(search_num, nums)
elif search_num < nums[mid_index]:
nums = nums[: mid_index] #被找的数处于二分之后列表中的左侧
search(search_num, nums)
else:
print('find it')
search(43, nums)
匿名函数
我们之前所用过的所有函数都是有名字的函数,那么什么叫匿名函数呢
我们将没有绑定名字,用一次之后内存地址被回收掉的函数称之为匿名(lambda)函数,该函数可以快速生成函数对象,语法不是很难,如下:
res = (lambda x, y: x+y) (1, 2)
print(res)
也可以把匿名函数赋值给一个变量来绑定关系,但这样就失去了匿名函数的意义了
f = lambda x, y: x+y
print(f)
prinr(f(1, 2))
常用内置函数
max , min, map, filter, sorted
max, min函数
我们有一个字典如下,我们需要拿到value中最大值和最小值对应的人名:
salaries = {'ming': 5000, 'tom':8700, 'alex':5600, 'egon':6355}
print(max(salaries, key = lambda k: salaries[k]))
print(min(salaries, key = lambda k: salaries[k]))
sorted函数
l = [10, 3, 8, 7, 12, 15, 2]
l1 = sorted(l, reverse = False) #用sorted排序将 l 列表中的元素从小到大排列
print(l1)
l1 = sorted(l, reverse = True) #用sorted排序将l 列表中的元素从大到小排列
print(l2)
map函数
name = ['ming', 'egon', 'tom', 'tony']
lst = map(lambda x: x+'aa', names) #在每个人名后面加上'aa'字符
print(list(lst)) #map函数将可迭代对象变成了迭代器对象,所以我们转换成列表
filter函数
names = ['min', 'egon', 'alex', 'xiaoxiao']
name_n = filter(lambda x: x.endswith('n'), names)# 将以'n'结尾的人名过滤掉
print(name_n)
print(list(name_n))filter 得到的是一个迭代器对象,我们转换成字符来看结果