递归函数
递归函数
函数的递归调用: 就是在调用一个函数的过程中又直接或间接的调用了自己
示例1: 直接调用自己
def foo():
print('hello')
foo()
foo()
示例2: 间接调用了自己
def bar():
print('from bar')
foo()
def foo():
print('hello')
bar()
foo()
为何死递归会抛出异常?
因为无限的递归会导致内存溢出, 所以python设定了最大的递归层数
import sys
print(sys.getrecursionlimit()) # 可以修改层数
所以: 不应该无限递归调用下去, 应该在满足某种条件下结束递归调用, 然后返回
递归调用分为两个阶段
1, 回溯: 一层层的递归调用下去
2, 递推: 在满足某一条件的情况下结束回溯, 然后开始向上一层一层的返回
def salary(n):
if n == 1:
return 18
return salary(n - 1) + 10
res = salary(5)
print(res)
nums=[111,[222,[333,[444,[5555,[6666,[777,[888,[9999]]]]]]]]]
def func(l):
for x in l:
if type(x) is list:
# 把自身的代码重新调用一次
func(x)
else:
print(x)
func(nums)
从小到大排列的一个数字列表
nums = [11, 13, 32, 47, 53, 73, 84, 91,101,111,222,333,444,5555]
def binary_search(l,find_num):
if len(l)==0:
print('find_num not exists')
return
mid_index = len(l) // 2
if find_num > l[mid_index]:
right_l = l[mid_index+1:]
binary_search(right_l,find_num)
elif find_num < l[mid_index]:
left_l = l[:mid_index]
binary_search(left_l,find_num)
else:
print('find it')
binary_search(nums,11)
三元表达式:表达式1 if 条件 else 表达式2
y = 111
x = 222
def max2(x,y):
if x > y:
return x
else:
return y
res = x if x > y else y
print(res)
匿名函数即没用名字的函数
res = (lambda x,y:x+y)(1,2)
print(res)
f= lambda x,y:x+y
print(f)
f(1,2)
特点:没有名字意味着只能用一次,用完之后就是垃圾,所以匿名函数只用于临时使用一次的场景
salaries = {
"egon":4.4,
"lqz":3.3,
"yh":2.2
}
def func(k):
return salaries[k]
print(max(salaries,key=lambda k:salaries[k]))
print(min(salaries,key=lambda k:salaries[k]))
print(sorted(salaries,key= lambda k:salaries[k],reverse=True))