递归函数

递归函数

函数的递归调用: 就是在调用一个函数的过程中又直接或间接的调用了自己
示例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))
posted @ 2020-07-23 22:05  刘海子  阅读(145)  评论(0编辑  收藏  举报