一 .递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归函数: 一个会调用自身的函数称为递归函数凡是循环能干的事情 递归都能干方式: 写出临界条件 我这一次和上一次的关系 假设当前函数已经能用 调用自身计算上一次结果 在求出本次的结果
必须有一个明确的结束条件;
每次进入更深一层递归时,问题规模相比上次递归都应有所减少
相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧
。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出
import sys print(sys.setrecursionlimit(1000)) # sys.setrecursionlimit() #设置最大递归层数 print(sys.getrecursionlimit()) #获取最大递归层数
# RecursionError: maximum recursion depth exceeded while calling a Python object 递归的错误 最大的深度
def aa():
print("1111")
aa()
print("22222222")
aa()
1111
1111
1111
..................
# 测试递归调用最大的深度 998 997
n=0
def cc():
global n
n+=1
print(n)
print("11111111111")
cc()
cc()
1.递归运行原理
def rec(i): #定义函数
print(i)
if i/2 > 1: #判断递归条件,退出
re = rec(i/2) #递归函数自身
print('返回值:',re)
print('上层递归值:',i)
return i #返回值
rec(10)
# """#运行原理:首先运行函数传参10给函数,打印10,判断条件满足,递归
# #函数参数值为(10/2)5,打印i的值5,等递归到1.25时,判断条件不满
# #足后,才打印上层递归的值,此时递归的值为1.25,return递归最后一
# #层的值1.25,退出最后一层递归,继续一层层退出递归,最后返回最上层
# #递归值结束函数。
# 5.0
# 2.5
# 1.25
# 上层递归值: 1.25
# 返回值: 1.25
# 上层递归值: 2.5
# 返回值: 2.5
# 上层递归值: 5.0
# 返回值: 5.0
# 上层递归值: 10"""
2. 递归案例
# # 输入一个数(大于等于1) 求 1+2+3.......的和
# # 简单的递归
def sum2(n):
if n==1:
return 1
else:
return n+sum2(n-1)
res=sum2(5)
print(res) #3
# 5+sum2(4)
# 5+4+sum2(3)
# 5+4+3+sum2(2)
# 5+4+3++2sum2(1)
# 5+4+3+2+1
#递归分解执行步骤
def sum2(5):
if 5==1:
return 1
else:
return 5+sum2(5-1)
4
def sum2(4):
if 4==1:
return 1
else:
return 4+sum2(4-1)
3
def sum2(3):
if 4==1:
return 1
else:
return 3+sum2(3-1)
2
def sum2(2):
if 4==1:
return 1
else:
return 2+sum2(2-1)
1
def sum2(1):
if 1==1:
return 1
else:
return n+sum2(n-1)
def foo(arg1,arg2,stop):
if arg1 == 0:
print(arg1,arg2,"第一次")
arg3 = arg1 + arg2
print(arg1,arg2,arg3,"第二次")
if arg3 < stop: #判断套件不满足时退出递归
foo(arg2,arg3,stop) #递归函数,传送参数arg2,arg3,stop给arg1,arg2,stop
foo(0,1,50)
# 1
# 1 1
# 1 2
# 2 3
# 3 5
# 5 8
# 8 13
# 13 21
# 21 34
# 34 55‘
def age(n):
if n==4:
return 40
elif n>0 and n<4:
return age(n+1)+2
print(age(1))
# 解析上面递归方法
def age(1):
if 1==4:
return 40
elif 1>0 and 1<4:
return age(1+1)+2
44
def age(2):
if 2==4:
return 40
elif 2>0 and 2<4:
return age(2+1)+2
42
def age(3):
if 3==4:
return 40
elif 3>0 and 3<4:
return age(3+1)+2
40
def age(4):
if 4==4:
return 40
elif n>0 and n<4:
return age(n+1)+2
def sum2(n):
if n==1:
return 1
else:
aa= n + sum2(n - 1)
return aa
res=sum2(6)
print(res)
# 6+5+4+3+2+1
# 斐波拉契竖列
# 后一项与前一项之差是不变的,这种数列称为等差数列。
# 斐波那契数列数列从第3项开始,每一项都等于前两项之和。
# 例子:数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368......
def bb(n):
if n==1or n==2:
return 1
return bb(n-1)+bb(n-2)
# return 1+1 4 3
d=bb(4)
print(d)
# 1+1+1
# def bb(4):
# if n==1or n==2:
# return 1
# return bb(4-1)+bb(4-2)
阶乘
# def bb(3):
# if n == 1 or n == 2:
# return 1
# bb(2) + bb(1)
#
# def bb(2):
# if n == 1 or n == 2:
# return 1
# bb(2) + bb(1)
# print(1+1)"""
# 阶乘 1*2*3
def fac(n):
if n==1:
return 1
return n*fac(n-1)
print(fac(5))
#
# 5*4*3*2*1
def b(aa):
print(aa)
if int(aa/2)==0:
return aa
res=b(int(aa/2))
return res
b(10)
# 10
# 5
# 2
# 1
# 输入一个数(大于等于1) 求 1+2+3.......的和
def sum1(n):
sum=0
for x in range(1,n+1):
print("x的值--------",x)
sum+=x
print("sum的值==",sum)
return sum
res=sum1(4)
print(res) #15
"""
x的值-------- 1
sum的值== 1
x的值-------- 2
sum的值== 3
x的值-------- 3
sum的值== 6
x的值-------- 4
sum的值== 10
10"""
# 读取 所有文件 递归
import os
def fun(pathname,n):
files=os.listdir(pathname)
for i in files:
cc=os.path.join(pathname,i)
if os.path.isdir(cc):
fun(cc,n+1)
print("\t"*n,i)
else:
print("\t"*n,i)
fun("F:\作业",0)
二分查找法 递归
# 二分查找法 必须数据有序
lise=[11,22,33,44,55,66,77,88,99]
n=99
left=0
right=len(lise)-1
while left<=right:
mode=(right+left)//2
if lise[mode] > n:
right=mode-1
if lise[left]<n:
left=mode+1
if lise[mode]==n:
print("说明找到了")
break
else:
print("没有找到哈哈哈")
print("*******************************************************")
# 递归实现的二分法 递归只能用return 不能用braek来返回 必须数据有序
lise=[11,22,33,44,55,66,77,88,99]
def func(n,left,right):
mode=(left+right)//2
if left<=right:
if lise[mode]>n:
right=mode-1
return func(n, left, right)
if lise[mode]<n:
left=mode+1
return func(n,left,right)
if lise[mode]==n:
print("找到了哈哈哈")
return mode
else:
print("没有找到")
aa=func(888,0,len(lise)-1)
print(aa)
斐波拉去数列 和 阶乘# 斐波拉去数列
def fun(n):
if n==1 or n==2:
return 1
return fun(n-1)+fun(n-2)
print(fun(10))
print("*****************************")
# 阶乘
def aa(n):
if n==1:
return 1
return n*aa(n-1)
print(aa(5))
来源:https://www.cnblogs.com/Sup-to/p/10851853.html