一 .递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归函数: 一个会调用自身的函数称为递归函数凡是循环能干的事情 递归都能干方式: 写出临界条件 我这一次和上一次的关系 假设当前函数已经能用 调用自身计算上一次结果 在求出本次的结果
必须有一个明确的结束条件;
每次进入更深一层递归时,问题规模相比上次递归都应有所减少
相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(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