编辑这个页面须要登录或更高权限!

Python 递归(Recursion)

在本文中,您将学习如何创建递归函数(调用自身的函数)。

什么是Python中的递归?

递归是根据自身定义某些内容的过程。

一个物理世界的示例是放置两个彼此面对的平行反射镜。它们之间的任何对象都将递归地反映出来。

Python递归函数

在Python中,我们知道一个函数可以调用其他函数。函数甚至可能会调用自身。这些类型的构造称为递归函数。

以下是查找整数的阶乘的递归函数的示例。

数字的阶乘是从1到该数字的所有整数的乘积。例如,阶乘6(表示为6!)是1 * 2 * 3 * 4 * 5 * 6 = 720

递归函数示例

def calc_factorial(x):
    """这是一个
    求整数阶乘的递归函数"""

    if x == 1:
        return 1
    else:
        return (x * calc_factorial(x-1))


num = 4
print("The factorial of", num, "is", calc_factorial(num))

在上面的示例中,它calc_factorial()是一个递归函数,它调用了自己。

当我们用正整数调用此函数时,它将通过减少数量来递归调用自身。

每个函数将数字乘以该数字下面的数字的阶乘,直到它等于1。可以在以下步骤中解释此递归调用。

calc_factorial(4)              # 1st call with 4
4 * calc_factorial(3)          # 2nd call with 3
4 * 3 * calc_factorial(2)      # 3rd call with 2
4 * 3 * 2 * calc_factorial(1)  # 4th call with 1
4 * 3 * 2 * 1                  # return from 4th call as number=1
4 * 3 * 2                      # return from 3rd call
4 * 6                          # return from 2nd call
24                             # return from 1st call

当数字减少到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

递归的优点

  1. 递归函数使代码看起来干净整洁。

  2. 使用递归可以将复杂的任务分解为更简单的子问题。

  3. 与使用嵌套嵌套相比,使用递归更容易生成序列。

递归的缺点

  1. 有时,递归背后的逻辑很难遵循。

  2. 递归调用很昂贵(效率低),因为它们占用大量内存和时间。

  3. 递归函数很难调试。

Python 基础教程
Python 流程控制
Python 函数
Python 数据类型
Python 文件操作
Python 对象和类
Python 日期和时间
Python 高级知识
Python 参考手册