亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> Python

精通Python递归:函数如何自我调用

精通Python递归

探索Python函数如何自我调用、递归机制及编写安全高效递归代码的最佳实践。

什么是递归?

递归是用同一问题的更小实例来定义问题的技术。

经典示例:两面平行镜子相对;每个镜像都是另一个的递归反射。


Python递归函数

Python中函数可调用其他函数,也可调用自身。此类构造称为 递归函数。

下图演示简单递归函数 recurse 的调用栈:

精通Python递归:函数如何自我调用

下面是经典示例:递归实现阶乘函数,返回所有不超过 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次返回

下图直观展示此逐步过程:

精通Python递归:函数如何自我调用

当输入值达到 基本条件(此处 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() 程序化调整递归限制,但需谨慎避免栈溢出。


递归优势

  1. 递归解法往往更简洁易读,尤其对自然递归表达的问题。
  2. 能将复杂任务优雅分解为更简单子问题。
  3. 序列生成(如斐波那契、排列)用递归比嵌套循环直观。

递归劣势

  1. 递归逻辑对初学者较难跟踪和推理。
  2. 每次递归调用消耗栈空间;深递归内存密集且比迭代慢。
  3. 调试递归因层层调用栈而具挑战性。

实践中,当递归带来更清晰、可维护代码且输入规模适中时选用。极大输入下,迭代方法或尾递归优化(如支持)可能更优。

Python

  1. 精通Python函数参数:位置、关键字与默认参数
  2. Python Lambda匿名函数实战指南
  3. 精通 Python 字典:创建、操作与进阶技巧
  4. Python 生成器:高效迭代与进阶用例
  5. Python 闭包详解:嵌套函数如何捕获变量
  6. 精通 Python 装饰器:专家技巧增强函数
  7. 精通 Python Lambda 函数:实用示例与最佳实践
  8. Python abs() 函数:计算数字与复数的绝对值
  9. Python round() 函数详解与实战示例
  10. 精通 Python range() 函数:从基础到高级用法
  11. 精通 Python map() 函数:语法、示例与最佳实践
  12. 精通 Python yield:生成器 vs return 实战指南