递归函数
一、递归是解决问题的一种方式,它的整体思想是,将一个小问题分解成一个个小问题直到无法分解后再去解决问题。
二、基线条件:问题可以被分解为最小问题,当满足基线条件时递归不再执行
三、递归条件:可以将问题继续分解的条件
# 求取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))