当前位置: 首页 > news >正文

递归函数:底层原理、实战案例、深度溢出与全套优化

博客导语

递归是算法基础核心,新手普遍不懂栈溢出原理、递归终止条件写法。本篇拆解函数调用栈底层,给出斐波那契、目录遍历经典案例,讲解递归深度限制、尾递归优化、迭代改写三种避坑方案。


一、递归底层原理

递归本质:函数内部调用自身。底层依靠函数调用栈实现,每递归调用一次,就会向栈内新增一个栈帧,保存局部变量、执行指针,上层函数不会结束,持续阻塞等待下层函数返回结果。

递归两大必备条件(缺一必死循环)

  1. 递归出口(终止条件):满足条件直接return,停止自我调用

  2. 递归推进:每次调用向出口靠近,参数持续收敛


二、经典零基础实战案例

案例1:递归计算阶乘

def factorial(n): # 递归出口 if n == 1: return 1 # 递归推进 return n * factorial(n-1) print(factorial(5)) # 120

案例2:递归遍历本地多层目录(生产常用)

自动遍历文件夹内所有文件,无需手动嵌套循环,适配未知层级目录


三、递归深度限制与栈溢出

1.默认深度限制

Python官方默认递归最大深度为1001层(系统预留一层),超过直接抛出RecursionError栈溢出异常。可通过sys查看默认值:

import sys print(sys.getrecursionlimit()) # 默认1000 sys.setrecursionlimit(2000) # 手动修改上限

2.手动修改上限治标不治本

操作系统本身有线程栈内存上限,强行修改Python限制,会直接导致程序崩溃、内存溢出,不推荐生产使用。


四、递归三大优化方案(生产落地)

方案1:尾递归优化

尾递归:递归调用是函数最后一步操作,无额外计算。栈帧可复用,不会持续占用内存。

注意:CPython官方不原生支持尾递归优化,仅理论生效,无法落地

方案2:迭代改写(最优方案)

所有递归都可以转为循环迭代,彻底消除栈溢出风险,生产优先使用

方案3:使用lru_cache缓存递归结果

解决斐波那契递归重复计算问题,提升百倍运行速度,通过装饰器缓存已经计算过的参数结果

from functools import lru_cache @lru_cache(maxsize=None) def fib(n): if n<=2: return 1 return fib(n-1)+fib(n-2)

五、递归使用选型边界

适合:层级固定、树形结构、目录遍历、回溯算法;不适合:深度未知、海量数据计算,优先迭代替代

http://www.jsqmd.com/news/1016143/

相关文章:

  • 抖音无水印下载终极教程:三步实现免费高清视频保存
  • PX4仿真环境配置踩坑实录:Gazebo Classic路径更新后,如何一劳永逸解决‘找不到软件包’错误
  • SkillSpector API集成:Python程序中调用安全扫描功能
  • VESC Tool配置电机时遇到的签名错误?手把手教你替换confgenerator文件解决问题
  • 手把手教你用3D Systems Touch玩转ROS Noetic:从驱动安装到第一个触觉Demo
  • centos7防火墙(firewalld、iptables)
  • 2026年湛江搬家行业服务评测:哪些搬家公司值得信赖?真实案例与收费标准全解析 - 优质品牌商家
  • 2026年环氧地坪施工队选择指南:从西南到全国,哪些品牌值得关注? - 优质品牌商家
  • 多维聚合数据操作:从GROUP BY到Pandas动态变形实战
  • Win11系统下HC05蓝牙模块连接不上?试试这个被遗忘的“添加设备”方法
  • 海康NVR RTSP流地址拼接的5个常见坑,新手必看(附排查流程图)
  • LWIP调优笔记:只改这三个参数,让STM32的TCP发送速率飙升(实测避坑指南)
  • 强化学习本质:状态-动作-奖励的因果决策链
  • 电赛备赛避坑:K210与Arduino Mega2560串口通信的那些“坑”与填坑指南
  • 【毕业设计】基于 Spring Boot 技术的线上问卷统计系统的设计与实现 面向日常调研场景的 Spring Boot 问卷系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • Mythos不是新模型:Claude推理增强中间件的技术解析
  • 3个专业级Android内存诊断方案:从堆栈追踪到SQL驱动的深度性能分析
  • SQL Server中巧妙处理重复记录的技巧
  • LitBench:领域专用文献大语言模型评测工具的设计与实践
  • Ubuntu 20.04 Noetic下,3D Systems Touch驱动安装避坑指南(附2023版TouchDriver下载)
  • 半导体工程师必会的5个Python脚本(提升效率10倍)
  • 当Stable Diffusion WebUI遇见ComfyUI:如何优雅解决AI绘画流程集成难题?
  • 大模型提示工程层归零:从显式编排到隐式能力封装
  • 终极Android电池保护指南:AccA开源充电控制器完整教程
  • MFC项目忘了勾选‘Windows套接字’?手把手教你两种补救方法搞定UDP通信
  • 【毕业设计】基于 Vue 和 SpringBoot 的线上健康监测管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 避坑指南:Arduino ESP32驱动TFT屏时,DMA模式下的那些常见错误与调试方法
  • 嵌入式工程师必看:手把手教你排查PHY芯片挂载失败的6个硬件坑(附波形图分析)
  • 避开这些坑!瑞萨RA_FSP DAC配置与硬件设计的实战避坑指南
  • 避坑指南:STM32 HAL库I2C读写AT24C64,为什么你读到的总是0xFF?