递归函数是Python中通过自身调用解决可分解为更小同类子问题的编程方法,关键在于明确终止条件和问题规模缩减;如阶乘中n! = n × (n−1)!,base case为n==0或1,recursive case需确保输入趋近终止条件。
递归函数是Python中一种用函数自身调用自身来解决问题的编程技巧。它不是炫技,而是对“问题可分解为更小同类子问题”这一现实逻辑的自然表达。写好递归,关键不在语法,而在准确识别“分解规则”和“终止条件”。
没有终止条件的递归会无限调用,最终触发RecursionError: maximum recursion depth exceeded。而每次递归调用,输入必须向终止条件靠近——也就是“问题规模变小”。比如计算阶乘:n! 可以拆成 n × (n−1)!,子问题 (n−1)! 的规模比原问题小1,且当 n == 0 或 n == 1 时直接返回1,这就是终止条件。
个更小的同类型问题表示?(即 recursive case)当数据存在任意深度的嵌套(如[1, [2, 3], [[4]], 5]),用循环逐层展开很麻烦;递归则简洁直观。核心思路是:遇到数字就收集,遇到列表就递归处理。
def flatten(lst):
result = []
for item in lst:
if isinstance(item, list):
result.extend(flatten(item)) # 递归处理子列表
else:
result.append(item)
return result
这个模式同样适用于解析API返回的嵌套字典(如带"children"键的树形菜单)、读取文件系统目录树等场景。
斐波那契数列是递归入门例子,但朴素实现效率极低:
def fib(n): # ❌ 指数级时间复杂度
if n <= 1:
return n
return fib(n-1) + fib(n-2)
因为fib(5)会重复计算fib(3)多次。实际项目中应改用记忆化(@lru_cache)或转为迭代。另外,默认递归深度限制约1000层,处理深层嵌套数据时需谨慎:
sys.setrecursionlimit(3000)可临时提高限制(不推荐盲目调高)list模拟)+ 循环的迭代写法try/except RecursionError做兜底,提示用户数据可能异常不是所有循环都能/都应该改写成递归。以下场景天然契合递归思维:
递归的价值在于让代码更贴近问题本质,而不是追求形式上的“简洁”。能清晰表达“怎么分解”和“何时停止”,递归就立住了。