Python 函数二

递归函数

• 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题。递归函数可以在函数主题内直接或者间接的调用自己。

• 递归式函数有2个条件
基线条件 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了,否则递归程序将无法结束.
递归条件 可以将问题继续分解的条件

计算阶乘是一个经典的递归实现,,回顾一下计算公式

在这里插入图片描述
可以通过定点debug的方式观察一下变量n的变化(10 -->1 -->10)来获得计算值

    # 基线条件判断
    if(n==1):
        return 1
    # 递归条件
    return n * fun(n-1)

res = fun(10)
print(res)

阶乘问题也可以用for 循环解决,一般递归函数需要更多的存储空间比较耗内存,对于没有必须要用递归函数的程序,最好用其他的办法改进。

res=1
for i in range(1,11):
    res*=i

print(res)
高阶函数

接收函数对象作为参数,或者,将别的函数对象作为返回值返回的函数就是高阶函数,满足其一即可成为高阶函数

匿名函数lambda作为参数传递无论接收还是返回,都是用的比较多的,下面做一个自定义函数的传递
# 判断某个数是不是为质数,简单一点默认i大于2
def fun(i):
    j = 2
    for j in range(2,i):
        if(i%j ==0):
            return False
    else:
        return True

# 定义一个判断某个数字范围内的所有质数
def fun1(fun):
    lst=[]
    for i in range(3,101):
        if fun(i):
            lst.append(i)

    return lst

print(fun1(fun))
  • 返回函数对象
匿名函数

对于有的函数不需要重复调用,直接传入匿名函数更方便,无需担心函数名冲突(即重名),也可以作为一个传参的工具将值赋值给一个变量,Lambda 函数用于创建一个匿名函数

Lambda 变量1,变量2,... : 表达式

变量列表用于表达式的计算,通常将Lambda赋值给一个变量,变量就可以作为一个函数使用

f = lambda x:x*x
# 变量f接收labmda,作为函数使用,传入实参2
print(f(2))

通过匿名函数实现1到100的累加

from functools import reduce
print(reduce(lambda x,y:x+y,range(1,101)))
'''
加深对匿名函数的理解,不一定真的会用到
'''
def fun(i,j):
    return lambda : i*j

# 返回的是一个函数对象 <function fun.<locals>.<lambda> at 0x000001C04EA59A60>
print(fun(3,4))
# res 用来接收一个函数对象
res = fun(3,4)
# 通过()来调用函数.即通过res()
print(res())
'''
匿名函数作为实参,形参f用于接收lambda函数
'''
def fun(i,j,f):
    return f(i,j)
# 位置传参,一一对应
res=fun(3,4,lambda i,j:i*j)
print(res)
闭包

闭包的条件

  • 函数嵌套 在一个外函数当中包含了一个内函数
  • 将内部函数作为返回值返回 ,外部函数的返回值是内函数的引用
  • 内部函数必须要使用到外部函数的变量
# 闭包保证被内部使用的外部变量不被销毁,保证外部函数的调用后num1不被立马销毁,和返回的inner对象绑定在一起继续操作
def outer(num1):
    def inner(num2):
        # 外函数的变量被内函数用于了计算
        return num1+num2
    return inner

# f 接收一个函数的对象
f = outer(1)
# 调用f,实现对内部函数的调用 ,函数的引用和函数的调用的概念
# f(2) = outer(1)(2)
print(f(2))
# 外部函数的变量1,可以直接使用,因为没有被销毁
print(f(6))

在这里插入图片描述
练习
2. 猴子吃桃问题(递归):
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少桃子?

# 猴子吃桃问题
def fun(n):
    if(n==1):
        return 1
    return (fun(n-1)+1)*2

# print(fun(10)) 1534
res = (fun(10) // 2) + 1
print(res) # 768
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值