python函数6_函数的递归调用_二分法_匿名函数

一、函数的递归调用

# 一:递归的定义
# 函数的递归调用:是函数嵌套调用的一种特殊形式
# 具体是指:
#        在调用一个函数的过程中又直接或者间接地调用到本身

# 直接调用本身
# def f1():
#     print('是我是我还是我')
#     f1()
# f1()

# 间接接调用本身
# def f1():
#     print('===>f1')
#     f2()
#
# def f2():
#     print('===>f2')
#     f1()
#
# f1()


# 一段代码的循环运行的方案有两种
# 方式一:while、for循环
# while True:
#     print(1111)
#     print(2222)
#     print(3333)

# 方式二:递归的本质就是循环:
# def f1():
#     print(1111)
#     print(2222)
#     print(3333)
#     f1()
# f1()


# 二:需要强调的的一点是:
# 递归调用不应该无限地调用下去,必须在满足某种条件下结束递归调用
# n=0
# while n < 10:
#     print(n)
#     n+=1


# def f1(n):
#     if n == 10:
#         return
#     print(n)
#     n+=1
#     f1(n)
#
# f1(0)

# 三:递归的两个阶段
# 回溯:一层一层调用下去
# 递推:满足某种结束条件,结束递归调用,然后一层一层返回

# age(5) = age(4) + 10
# age(4) = age(3) + 10
# age(3) = age(2) + 10
# age(2) = age(1) + 10
# age(1) = 18

# def age(n):
#     if n == 1:
#         return 18
#     return age(n-1) + 10
#
#
# res=age(5)
# print(res)

# 四:递归的应用
l=[1,2,[3,[4,[5,[6,[7,[8,[9,10,11,[12,[13,]]]]]]]]]]

def f1(list1):
    for x in list1:
        if type(x) is list:
            # 如果是列表,应该再循环、再判断,即重新运行本身的代码
            f1(x)
        else:
            print(x)

f1(l)

递归作业


nums=[-3,4,7,10,13,21,43,77,89]
find_num=8
def binary_search(find_num,l):
    print(l)
    if len(l) == 0:
        print('找的值不存在')
        return False
    mid_index=len(l) // 2

    if find_num > l[mid_index]:
        # 接下来的查找应该是在列表的右半部分
        l=l[mid_index+1:]
        return binary_search(find_num,l)
    elif find_num < l[mid_index]:
        # 接下来的查找应该是在列表的左半部分
        l=l[:mid_index]
        return binary_search(find_num,l)
    else:
        print('find it')
        return True

res=binary_search(7,nums)
print(res)

# def salary(n): # n = 3
#     if n==1:
#         return 5000
#     res=salary(n-1)+1000 # 6000 + 1000
#
#     return res
#
# res=salary(4) # salary(4)=>salary(3)+1000
#
#
#
# salary(4)=>salary(3) + 1000=>salary(2)+1000=>salary(1) + 1000
# salary(4)=>7000 + 1000=>6000+1000<=5000 + 1000

二、二分法


# 算法:是高效解决问题的办法
# 算法之二分法

# 需求:有一个按照从小到大顺序排列的数字列表
#      需要从该数字列表中找到我们想要的那个一个数字
#      如何做更高效???


nums=[-3,4,7,10,13,21,43,77,89]
find_num=10

nums=[-3,4,13,10,-2,7,89]
nums.sort()
print(nums)

# 方案一:整体遍历效率太低
# for num in nums:
#     if num == find_num:
#         print('find it')
#         break

# 方案二:二分法
# def binary_search(find_num,列表):
#     mid_val=找列表中间的值
#     if find_num > mid_val:
#         # 接下来的查找应该是在列表的右半部分
#         列表=列表切片右半部分
#         binary_search(find_num,列表)
#     elif find_num < mid_val:
#         # 接下来的查找应该是在列表的左半部分
#         列表=列表切片左半部分
#         binary_search(find_num,列表)
#     else:
#         print('find it')

# nums=[-3,4,7,10,13,21,43,77,89]
# find_num=8
# def binary_search(find_num,l):
#     print(l)
#     if len(l) == 0:
#         print('找的值不存在')
#         return
#     mid_index=len(l) // 2
#
#     if find_num > l[mid_index]:
#         # 接下来的查找应该是在列表的右半部分
#         l=l[mid_index+1:]
#         binary_search(find_num,l)
#     elif find_num < l[mid_index]:
#         # 接下来的查找应该是在列表的左半部分
#         l=l[:mid_index]
#         binary_search(find_num,l)
#     else:
#         print('find it')
#
# binary_search(find_num,nums)

三、匿名函数

# 1、def用于定义有名函数
# func=函数的内存地址
# def func(x,y):
#     return x+y

# print(func)
# 2、lamdab用于定义匿名函数
# print(lambda x,y:x+y)


# 3、调用匿名函数
# 方式一:
# res=(lambda x,y:x+y)(1,2)
# print(res)

# 方式二:
# func=lambda x,y:x+y
# res=func(1,2)
# print(res)

#4、匿名用于临时调用一次的场景:更多的是将匿名与其他函数配合使用

四、匿名函数的应用


salaries={
    'siry':3000,
    'tom':7000,
    'lili':10000,
    'jack':2000
}
# 需求1:找出薪资最高的那个人=》lili
# res=max([3,200,11,300,399])
# print(res)

# res=max(salaries)
# print(res)


salaries={
    'siry':3000,
    'tom':7000,
    'lili':10000,
    'jack':2000
}
# 迭代出的内容    比较的值
# 'siry'         3000
# 'tom'          7000
# 'lili'         10000
# 'jack'         2000

# def func(k):
#     return salaries[k]

# ========================max的应用
# res=max(salaries,key=func) # 返回值=func('siry')
# print(res)

# res=max(salaries,key=lambda k:salaries[k])
# print(res)

# ========================min的应用
# res=min(salaries,key=lambda k:salaries[k])
# print(res)


# ========================sorted排序
# salaries={
#     'siry':3000,
#     'tom':7000,
#     'lili':10000,
#     'jack':2000
# }
res=sorted(salaries,key=lambda k:salaries[k],reverse=True)
# print(res)

# ========================map的应用(了解)
# l=['alex','lxx','wxx','薛贤妻']
# new_l=(name+'_dsb' for name in l)
# print(new_l)

# res=map(lambda name:name+'_dsb',l)
# print(res) # 生成器
# ========================filter的应用(了解)
# l=['alex_sb','lxx_sb','wxx','薛贤妻']
# res=(name for name in l if name.endswith('sb'))
# print(res)

# res=filter(lambda name:name.endswith('sb'),l)
# print(res)

# ========================reduce的应用(了解)
from functools import reduce
res=reduce(lambda x,y:x+y,[1,2,3],10) # 16
print(res)

res=reduce(lambda x,y:x+y,['a','b','c']) # 'a','b'
print(res)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福海鑫森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值