第十节课

递归函数

一、递归是解决问题的一种方式,它的整体思想是,将一个小问题分解成一个个小问题直到无法分解后再去解决问题。
二、基线条件:问题可以被分解为最小问题,当满足基线条件时递归不再执行
三、递归条件:可以将问题继续分解的条件

# 求取10的阶乘
# 1 = 1*1
# 2 = 1*2
# 3 = 1*2*
n = 1
for i in range(1, 11):
    n *= i
print(n)  # 使用for循环来解题。

def fun(n):
    r = 1
    for i in range(1, n + 1):
      r *= i  # 用函数来写
    return r  # r是返回值如果没有返回值会输出一个Nnon。用return来返回。

print(fun(10))
# 递归就是自己调用自己,递归函数就是在函数中调用函数本身。
# 无穷递归
# def fun():
#    fun
# fun()
# 递归的两个条件:
# 1、基线条件:一个问题分解为一个最小问题,当满足基线条件时再去解决。
# 2、递归条件:将问题继续分解的条件
# 求取10的阶乘
# 10 = 10 * 9递归条件 n = n *(n - 1) == fun(n) = n *fun(n - 1)
# 9 = 9 * 8
# 1 = 1 基线条件
def fun(n):  # fun(n)是为了求取n的阶乘
    if n == 1:
        return 1
    return n * fun(n - 1)


print(fun(10))  # 10 * fun(9)函数的调用10*9*8*7*6*5*4*3*2*1当为1时结束递归

递归练习

# 求任意数的任意次幂
# 10 ** 5 = 10 * 10 ** 4
# 10 ** 4 = 10 * 10 ** 3
# 10 ** 3 = 10 * 10 ** 2
# 10 ** 2 = 10
# 10 ** 1 = 10 *10
def fun(a, b):
    if b == 1:
        return a
    return a * fun(a, b-1)
print(fun(10, 5))
# 求一个字符串是否是回文字符串
# 第一种              # 第二种
# 12345678987654321  # 123456789987654321
# 234567898765432    # 2345678998765432    #向下每次对比最外层的数是否相等如果相等为True不相等则为False。
def fun1 (s):
    if len(s) < 2:
        return True
    elif s[0] != s[-1]:# 按索引s[0]是开头,s[-1]是最结尾。对比开头和结尾一样的为True,不一样的为False
        return False
    return fun1(s[1: -1])  #切片除去头尾
print(fun1('123456789987654321'))
print(fun1('12345678987654321'))

高阶函数

一、接收函数作为参数,或者将函数作为返回值返回的函数是高阶函数。

# 高阶函数
#接受函数对象作为参数,或者将别的函数对象作为返回值返回的函数。两种条件满足任意一种就是高阶函数。
def fun2(i):
    if i % 2 == 0:
        return True

def fun(fn): #fn是函数的参数(形参),形参等于实参所以fn = fun2
    list1 = []
    for i in range(101):
        if fn(i): #fn(i) = fun2(i)
            list1.append(i)
    return list1

print(fun(fun2))# 将fun2作为参数

匿名函数

一、语法:(lambda 形参:表达式)(实参)

#匿名函数
#1、防止重名
#2、不用去定义函数,方便使用
#3、作为一个传参的工具
#lambda就是匿名函数
list1 = [1,2,3,4,5,6,7]
#匿名函数的语法:lambda 参数:表达式
print((lambda a, b: a + b)(1, 2))
#print((lambda a, : a % 2 == 0)(list1))
#filter() 有两个参数,第一个参数是过滤规则,
s = lambda a : a % 2 == 0
print(list(filter(s, list1)))

闭包

一、将函数对象作为返回值也是高阶函数我们称为闭包。
二、闭包的好处
1、通过闭包可以创建一些只有当前函数才能访问的变量。
2、可以将一些私有的数据藏在闭包中。
三、闭包的条件
1、函数嵌套
2、将内部函数作为返回值返回。
3、内部函数必须使用到外部函数的变量。

#函数嵌套
#将内部函数对象作为返回值返回。
#内部函数必须使用到外部函数的变量或参数。
#闭包可以保证内部使函数使用的外部变量不会被销毁
#定义一个外部函数
#修改外部函数变量
def fun1(num1):
    #定义一个内部函数
    def fun2(num2):
        # global num1 #将局部变量变成全局变量
        nonlocal num1  # 告诉解释器这里使用的不是本地的num1,是外部变量的num1
        num1 = 10
        res = num1 +num2#使用外部函数
        #print(res)
        return res# 内部函数的返回值

    print(num1)
    fun2(1)
    print(num1)

    return fun2# 外部函数的返回值

#函数的调用等于函数的返回值
f = fun1(1) #fun1(1)() = fun2() = f()
#内部函数的调用 fun2()
print(f(2))
print(f(3))

课后作业

一、猴子吃桃问题(递归):
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,
又多吃了一个。以后每天早上都吃了前一天剩的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了,
求第一天共摘了多少桃子?

#10,1
#9,4
#8,10
#7,22
#6,46
#5,94
#4,190
#3,382
#2,766
#1,1534

def fun(a,b):
    if a == 1:
        return b
    return fun(a-1, (b+1) * 2)


print(fun(10,1))

猜你喜欢

转载自blog.csdn.net/weixin_55924597/article/details/115107836