函数的引用
如果函数收到的是一个可变对象(比如字典或列表)的引用,就能够修改对象的原始值------=相当于通过"传引用"来传递对象
如果函数收到的时一个不可变对象(如数字 字符或 元组)的引用,就不能直接修改原始对象----相当于"传值"来传递对象
函数的引用: 如函数名引用 函数传递时的引用传递
def test1():
print('___________')
#test1() # 调用函数
res = test1 # 可理解为变量的赋值 引用函数名
print(id(res))
print(id(test1))
res()
res 和 test1引用同一对象
递归函数
递归函数的特性 1)必须有一个明确的结束条件; 2)每次进入更深一层递归时,问题规模相比上次递归都应有所减少; 3)相邻两次重复之前有紧密的联系,前一次要为后一次做准备; 4)递归效率不高,递归层次过多会导致栈溢出 5)优点:定义简单,逻辑清晰
1.前n项和
def funb(n):
if n>=0:
return funb(n-1)+n # funb(n-1)表示前n-1项的和
else:
return 0
print(funb(3))
递归过程 f(3) =f(2)+3 =f(1)+2+3 f(0)+1+2+3 要f(0)设置一个初始值 f(0)=0
回溯 # =0+1+2+3 # =1+2+3 # =3+3 # =6
2.斐波那契数列
用递归函数求斐波那契序列1,1,2,3,5,8.... 思路: 1)看题找规律1+1=2,1+2=3,2+3=5 3+5=8 2)得到规律 后面一项的值=前面俩项的和
list1=[]
def funa(n):
if n<=1:
return n
else:
return funa(n-1)+funa(n-2)
# 调用 前20项
for i in range(1,21):
list1.append(funa(i)) # 添加第i项,完成上面函数的调用
print(list1)
递推:给递归实现拆解,递归每一次都是基于上一次进行下一次的执行 回溯:遇到终止条件之前,从最后往回反,一级一级的把值返回来
3.回调函数
def test3(m,n):
if m==2:
n()
else:
print("不可调用")
def one():
print("函数一")
def two():
print("函数二")
test3(2,two)
将第三个函数作为第一个函数的参数传进去
在一个函数内进行调用(此方法可以做一个触发器)