1. 递归的定义
❖递归 Recursion是一种解决问题的方法,其精髓在于将问题分解为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决。
❖递归的问题分解方式非常独特,其算法方面的明显特征就是:在算法流程中调用自身。
❖递归为我们提供了一种对复杂问题的优雅解决方案,精妙的递归算法常会出奇简单,令人赞叹。
2.初识递归:数列求和
#用for循环写
def listsum(numList):
theSum=0
for i in numList:
theSum=theSum+i
return theSum
print(listsum([1,3,5,7,9]))
25
#用递归写
def listsum(numList):
if len(numList)==1:
return numList[0] #最小规模
else: #减小规模
return numList[0]+listsum(numList[1:])
print(listsum([1,3,5,7,9]))
25
3.递归程序如何被执行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YRVN3YvF-1584153850389)(attachment:image.png)]
4. 递归三定律
❖为了向阿西莫夫的“机器人三定律”致敬,递归算法也总结出“三定律”
1,递归算法必须有一个基本结束条件(最小规模问题的直接解决)
2,递归算法必须能改变状态向基本结束条件演进(减小问题规模)
3,递归算法必须调用自身(解决减小了规模的相同问题)
5. 递归的应用-任意进制的转换
#整数转换为任意进制
def toStr(n,base):
converString='0123456789ABCDEF'
if n<base:
return converString[n] #最小规模
else: #减小规模
return toStr(n//base,base)+converString[n%base]
#35转换为二进制
print(toStr(35,2))
100011
6.递归调用的实现
❖当一个函数被调用的时候,系统会把调用时的现场数据压入到系统调用栈
❖每次调用,压入栈的现场数据称为栈帧
当函数返回时,要从调用栈的栈顶取得返回地址,恢复现场,弹出栈帧,按地址返回。
❖在调试递归算法程序的时候经常会碰到这样的错误:RecursionError(递归的层数太多,系统调用栈容量有限)
❖这时候要检查程序中是否忘记设置基本结束条件,导致无限递归
或者向基本结束条件演进太慢,导致递归层数太多,调用栈溢出
❖在Python内置的sys模块可以获取和调整最大递归深度
import sys
sys.getrecursionlimit() #获取当前最大递归深度
#sys.setrecursionlimit(3000) #设置当前最大递归深度
sys.getrecursionlimit() #获取当前最大递归深度
3000