在本教程中,您将学习创建一个递归函数(一个调用自身的函数)。

什么是递归?

递归是根据自身定义某事物的过程。
一个物理世界的例子是放置两个相互面对的平行镜子。它们之间的任何对象都将被递归反射。


Python 递归函数

在 Python 中,我们知道一个函数可以调用其他函数。函数甚至可以调用自身。这些类型的构造被称为递归函数。
下图显示了名为 的递归函数的工作recurse。
image.png
Python 中的递归函数
以下是查找整数阶乘的递归函数的示例。
一个数的因数是从 1 到该数的所有整数的乘积。例如,6 的阶乘(表示为 6!)是12345*6 = 720.

递归函数的例子

def factorial(x): “””This is a recursive function to find the factorial of an integer””” if x == 1: return 1 else: return (x factorial(x-1)) num = 3 print(“The factorial of”, num, “is”, factorial(num))
*输出

3 的阶乘是 6
在上面的例子中,factorial()是一个递归函数,因为它调用自己。

当我们用一个正整数调用这个函数时,它会通过递减数字递归调用自己。
每个函数都将数字与其下方数字的阶乘相乘,直到它等于 1。这个递归调用可以在以下步骤中解释。
factorial(3) # 第一次调用 3 3 factorial(2) # 2nd call with 2 3 2 factorial(1) # 第 3 次调用 1 3 2 1 # 从第三次调用返回为 number=1 3 2 # 从第二次调用返回 6 # 从第一次调用返回
让我们看一张图片,它显示了正在发生的事情的分步过程:
image.png
递归阶乘函数的工作
当数字减少到 1 时,我们的递归结束。这称为基本条件。
每个递归函数都必须有一个停止递归的基本条件,否则函数会无限调用自身。
Python 解释器限制递归的深度以帮助避免无限递归,从而导致堆栈溢出。
默认情况下,递归的最大深度为 1000. 如果超过限制,则结果为RecursionError。让我们看一种这样的情况。
def recursor(): recursor() recursor()
输出
回溯(最近一次调用最后一次): 文件“”,第 3 行,在 中 文件“”,第 2 行,在一个 文件“”,第 2 行,在一个 文件“”,第 2 行,在一个 [上一行重复了 996 次以上] RecursionError:超过最大递归深度


递归的优点

  1. 递归函数使代码看起来干净优雅。
  2. 使用递归可以将复杂的任务分解为更简单的子问题。
  3. 使用递归生成序列比使用一些嵌套迭代更容易。

递归的缺点

  1. 有时递归背后的逻辑很难理解。
  2. 递归调用很昂贵(低效),因为它们占用大量内存和时间。
  3. 递归函数很难调试。