Python基础夯实:递归算法

简介: 递归算法

一、函数执行流程


http://pythontutor.com/visualize.html#mode=edit

image.png

示例.png


  • 全局帧中生成 foo1foo2foo3main 函数对象
  • main 函数调用
  • main 中查找内建函数 print 压栈,将常量字符串压栈,调用函数,弹出栈顶
  • main 中全局查找函数 foo1 压栈,将常量 100、101 压栈,调用函数 foo1,创建栈帧。print 函数压栈,字符串和变量 bb1 压栈,调用函数,弹出栈顶,返回值
  • main 中全局查找函数 foo2 压栈,将常量 200 压栈,调用函数 foo2,创建栈帧。foo3 函数压栈,变量 c 引用压栈,调用 foo3,创建栈帧。foo3 完成 print 函数调用后返回。foo2 恢复调用,执行 print 后,返回值。mainfoo2 调用结束弹出栈顶。main 继续执行 print 函数调用,弹出栈顶。main 函数返回

image.png

示例.png

image.png

示例.png


二、递归 Recursion


  • 函数直接或见着调用自身就是 递归
  • 递归需要有边界条件、递归前进段、递归返回段
  • 递归一定要有 边界条件
  • 当边界条件不满足的时候,递归前进
  • 当边界条件满足的时候,递归返回

    image.png
    示例.png

2.1 斐波那契数列 Fibonacci number:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ....


  • F(n) 为该数列第 n 项(n∈N*),那么这句话可写成:F(n)=F(n-1)+F(n-2)
  • F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2)

a = 0
b = 1
n = 10   # 55
# 循环实现
for i in range(n -1):
    a, b = b, a + b
else:
    print(b)
# 递归实现
def fib(n):
    return 1 if n < 3 else fib(n-1) + fib(n-2)
  • fib(5) 解析
    fib(4) + fib(3)
    fib(4) 调用 fib(3)fib(2)
    fib(3) 调用 fib(2)fib(1)
    fib(2)fib(1) 是边界 return 1,所有函数调用逐层返回


2.2 递归要求


  • 递归一定要有退出条件,递归调用一定要执行到这个退出条件。没有退出条件的递归调用,就是无限调用
  • 递归调用的深度不宜过深
  • Python 对递归调用的深度做了限制,以保护解释器
  • 超过递归深度限制,抛出 RecursionError: maxinum recursion depth exceeded 超出最大深度
  • sys.getrecursionlimit()


2.3 递归性能 fib(35) 比较


  • for 循环

    image.png
    示例.png
  • 递归
    image.png

    示例.png


2.4 递归的性能


  • 循环稍微复杂一些,但是只要不是死循环,可多次迭代直至算出结果
  • fib 函数代码极简易懂,但是只能获取到最外层函数调用,内部递归结果都是中间结果。而且给定一个 n 都要进行近 2n 次递归,深度越深,效率越低。为了获取斐波那契数列需要外面再套一个 n 次循环,效率就更低了
  • 递归还有深度限制,若递归复杂,函数反复压栈,栈内存很快就溢出了
  • 斐波那契数列改进

def fib(n, a=0, b=1):
    a, b = b, a+b
    if n == 1:
        return a
    return fib(n-1, a, b)
print(fib(4))
  • 改进后的函数和循环的思想类似
  • 参数 n 是边界条件,用 n 来计数
  • 上次的计算结果直接作为函数的实参
  • 效率高
  • 和循环比较,性能相近。所以并不是说递归一定效率低下,但递归有深度限制


2.5 间接递归

def foo1():
    foo2()
def foo2():
    foo1()
foo1()

间接递归,是通过别的函数调用了函数自身

拖构成了循环递归调用是非常危险的,但往往这种情况在代码复杂情况下,很可能发生这种调用,要用代码的规范来避免递归调用的发生


三、递归总结


  • 递归是一种很自然的表达,符合逻辑思维
  • 递归相对运行效率低,每一次调用函数都要开辟栈帧
  • 递归有深度限制,若递归层次太深,函数反复压栈,栈内存很快就溢出了
  • 若是有限次数的递归,可使用递归调用,或使用循环代替,循环代码稍复杂一些,但只要不是死循环,可多次迭代直至算出结果
  • 绝大多数递归,都可使用循环实现
  • 即使递归代码很简洁,但 能不用则不用 递归


四、递归练习


4.1 求 n 的阶乘


  • 按公式

def fac(n):
    if n == 1:
        return 1
    return n * fac(n-1)
def fac(n):
    return 1 if n < 2 else n * fac(n-1)
  • 按循环

n = 6
fac = 1
for i in range(n, 0, -1):   # 计数器 n 次
    fac = fac * i
print(fac)
def fac1(n, fac=1):
    fac = fac * n
    if n == 1:
        return fac
    return fac1(n-1, fac)


4.2 将一个数逆序放入列表中,例如 1234 => [4, 3, 2, 1]


  • 传入字符串

target = []
def revert(data):
    target.append(data[-1])
    if len(data) == 1:
        return target
    return revert(data[:-1])
revert('1234')
def revert(data, target=None):
    if target is None:
        target = list()
    target.append(data[-1])
    if len(data) == 1:
        return target
    return revert(data[:-1], target)
revert('1234')
def revert(data):
    if data == '':
        return []
    return [data[-1]] + revert(data[:-1])
revert('1234')
  • 传入数字

def revert(data, target=None):
    if target is None:
        target = list()
    if not isinstance(target, list):
        return
    x, y = divmod(data, 10)
    target.append(y)
    if x:
        return revert(x, target)
    return target
revert(120340)


4.3 解决猴子吃桃问题


  • 按题意

def peach(days=1):
    if days == 10:
        return 1
    return 2 * (peach(days+1) +1)
def peach(days=10):
    if days == 1:
        return 1
    return 2 * (peach(days-1) + 1)
  • 按循环

peach = 1
for i in range(9):
    peach = 2 * (peach + 1)
print(peach)
def fn(days=9, peach=1):
    peach = 2 * (peach + 1)
    if days == 1:
        return peach
    return fn(days-1, peach)
fn()
目录
相关文章
|
1月前
|
机器学习/深度学习 存储 算法
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
|
2月前
|
监控 算法 安全
深度洞察内网监控电脑:基于Python的流量分析算法
在当今数字化环境中,内网监控电脑作为“守城卫士”,通过流量分析算法确保内网安全、稳定运行。基于Python的流量分析算法,利用`scapy`等工具捕获和解析数据包,提取关键信息,区分正常与异常流量。结合机器学习和可视化技术,进一步提升内网监控的精准性和效率,助力企业防范潜在威胁,保障业务顺畅。本文深入探讨了Python在内网监控中的应用,展示了其实战代码及未来发展方向。
|
2月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
236 5
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
10天前
|
存储 算法 文件存储
探秘文件共享服务之哈希表助力 Python 算法实现
在数字化时代,文件共享服务不可或缺。哈希表(散列表)通过键值对存储数据,利用哈希函数将键映射到特定位置,极大提升文件上传、下载和搜索效率。例如,在大型文件共享平台中,文件名等信息作为键,物理地址作为值存入哈希表,用户检索时快速定位文件,减少遍历时间。此外,哈希表还用于文件一致性校验,确保传输文件未被篡改。以Python代码示例展示基于哈希表的文件索引实现,模拟文件共享服务的文件索引构建与检索功能。哈希表及其分布式变体如一致性哈希算法,保障文件均匀分布和负载均衡,持续优化文件共享服务性能。
|
15天前
|
监控 算法 安全
公司电脑网络监控场景下 Python 广度优先搜索算法的深度剖析
在数字化办公时代,公司电脑网络监控至关重要。广度优先搜索(BFS)算法在构建网络拓扑、检测安全威胁和优化资源分配方面发挥重要作用。通过Python代码示例展示其应用流程,助力企业提升网络安全与效率。未来,更多创新算法将融入该领域,保障企业数字化发展。
37 10
|
16天前
|
监控 算法 安全
基于 Python 广度优先搜索算法的监控局域网电脑研究
随着局域网规模扩大,企业对高效监控计算机的需求增加。广度优先搜索(BFS)算法凭借其层次化遍历特性,在Python中可用于实现局域网内的计算机设备信息收集、网络连接状态监测及安全漏洞扫描,确保网络安全与稳定运行。通过合理选择数据结构与算法,BFS显著提升了监控效能,助力企业实现智能化的网络管理。
27 7
|
1月前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
56 12
|
1月前
|
算法 安全 网络安全
基于 Python 的布隆过滤器算法在内网行为管理中的应用探究
在复杂多变的网络环境中,内网行为管理至关重要。本文介绍布隆过滤器(Bloom Filter),一种高效的空间节省型概率数据结构,用于判断元素是否存在于集合中。通过多个哈希函数映射到位数组,实现快速访问控制。Python代码示例展示了如何构建和使用布隆过滤器,有效提升企业内网安全性和资源管理效率。
51 9
|
3月前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
140 66
|
1月前
|
监控 算法 安全
内网桌面监控软件深度解析:基于 Python 实现的 K-Means 算法研究
内网桌面监控软件通过实时监测员工操作,保障企业信息安全并提升效率。本文深入探讨K-Means聚类算法在该软件中的应用,解析其原理与实现。K-Means通过迭代更新簇中心,将数据划分为K个簇类,适用于行为分析、异常检测、资源优化及安全威胁识别等场景。文中提供了Python代码示例,展示如何实现K-Means算法,并模拟内网监控数据进行聚类分析。
47 10

热门文章

最新文章