python数据结构: 递归1

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
发布了51 篇原创文章 · 获赞 34 · 访问量 911

猜你喜欢

转载自blog.csdn.net/weixin_43412569/article/details/104856239