精通Python递归:函数如何自我调用
精通Python递归
探索Python函数如何自我调用、递归机制及编写安全高效递归代码的最佳实践。
什么是递归?
递归是用同一问题的更小实例来定义问题的技术。
经典示例:两面平行镜子相对;每个镜像都是另一个的递归反射。
Python递归函数
Python中函数可调用其他函数,也可调用自身。此类构造称为 递归函数。
下图演示简单递归函数 recurse 的调用栈:

下面是经典示例:递归实现阶乘函数,返回所有不超过 x 的正整数乘积。
递归函数示例
def factorial(x):
"""Recursively compute the factorial of a positive integer."""
if x == 1:
return 1
return x * factorial(x - 1)
num = 3
print("The factorial of", num, "is", factorial(num))
输出
The factorial of 3 is 6
此处 factorial() 为递归函数,因其调用自身直到基本情况 x == 1。
用正整数调用时,函数反复用递减值调用自身:
factorial(3) # 第1次调用,参数3 3 * factorial(2) # 第2次调用,参数2 3 * 2 * factorial(1) # 第3次调用,参数1 3 * 2 * 1 # 从第3次返回 3 * 2 # 从第2次返回 6 # 从第1次返回
下图直观展示此逐步过程:

当输入值达到 基本条件(此处 x == 1)时递归终止。每个递归函数必须包含停止标准;否则无限继续最终耗尽调用栈。
Python强制最大递归深度(默认 1000)防止无限递归崩溃解释器。超出限制抛出 RecursionError:
def recursor():
recursor()
recursor()
输出
Traceback (most recent call last): File "<string>", line 3, in <module> File "<string>", line 2, in a File "<string>", line 2, in a File "<string>", line 2, in a [Previous line repeated 996 more times] RecursionError: maximum recursion depth exceeded
可用 sys.setrecursionlimit() 程序化调整递归限制,但需谨慎避免栈溢出。
递归优势
- 递归解法往往更简洁易读,尤其对自然递归表达的问题。
- 能将复杂任务优雅分解为更简单子问题。
- 序列生成(如斐波那契、排列)用递归比嵌套循环直观。
递归劣势
- 递归逻辑对初学者较难跟踪和推理。
- 每次递归调用消耗栈空间;深递归内存密集且比迭代慢。
- 调试递归因层层调用栈而具挑战性。
实践中,当递归带来更清晰、可维护代码且输入规模适中时选用。极大输入下,迭代方法或尾递归优化(如支持)可能更优。
Python
- 精通Python函数参数:位置、关键字与默认参数
- Python Lambda匿名函数实战指南
- 精通 Python 字典:创建、操作与进阶技巧
- Python 生成器:高效迭代与进阶用例
- Python 闭包详解:嵌套函数如何捕获变量
- 精通 Python 装饰器:专家技巧增强函数
- 精通 Python Lambda 函数:实用示例与最佳实践
- Python abs() 函数:计算数字与复数的绝对值
- Python round() 函数详解与实战示例
- 精通 Python range() 函数:从基础到高级用法
- 精通 Python map() 函数:语法、示例与最佳实践
- 精通 Python yield:生成器 vs return 实战指南