博客导语递归是算法基础核心新手普遍不懂栈溢出原理、递归终止条件写法。本篇拆解函数调用栈底层给出斐波那契、目录遍历经典案例讲解递归深度限制、尾递归优化、迭代改写三种避坑方案。一、递归底层原理递归本质函数内部调用自身。底层依靠函数调用栈实现每递归调用一次就会向栈内新增一个栈帧保存局部变量、执行指针上层函数不会结束持续阻塞等待下层函数返回结果。递归两大必备条件缺一必死循环递归出口终止条件满足条件直接return停止自我调用递归推进每次调用向出口靠近参数持续收敛二、经典零基础实战案例案例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(maxsizeNone) def fib(n): if n2: return 1 return fib(n-1)fib(n-2)五、递归使用选型边界适合层级固定、树形结构、目录遍历、回溯算法不适合深度未知、海量数据计算优先迭代替代