# 递归

> 原文： [https://pythonspot.com/recursion/](https://pythonspot.com/recursion/)

在英语中，有许多递归示例：

*   “要了解递归，您必须先了解递归”，
*   “人就是人的母亲”。

You might wonder, what does this have to do with programming?

您可能需要将一个复杂的问题分解为几个较小的问题。 您已经熟悉[循环或迭代](https://pythonspot.com/loops/)。 在某些情况下，递归可能是更好的解决方案。

在 Python 中，**如果函数调用自身并且具有终止条件**，则该函数是递归的。 为什么要终止条件？ 阻止函数自称广告无穷大。

## 递归示例

## Recursion in with a list

Let’s start with a very basic example: adding all numbers in a list.  Without recursion, this could be:

```py
#!/usr/bin/env python

def sum(list):
    sum = 0

    # Add every number in the list.
    for i in range(0, len(list)):
        sum = sum + list[i]

    # Return the sum.
    return sum

print(sum([5,7,3,8,10]))

```

在我们简单地调用 sum 函数的地方，该函数将每个元素添加到变量 sum 并返回。 递归执行此操作：

```py
#!/usr/bin/env python

def sum(list):
    if len(list) == 1:
        return list[0]
    else:
        return list[0] + sum(list[1:])

print(sum([5,7,3,8,10]))

```

如果列表的长度为 1，则返回列表（终止条件）。 否则，它返回元素，并调用函数 sum（）减去列表中的一个元素。 如果执行了所有调用，则返回达到终止条件并返回应答。

## 递归阶乘

阶乘的数学定义是：n！ = n *（n-1）!,如果 n &gt; 1 并且 f（1）= 1.示例：3！ = 3 x 2 x 1 =6。我们可以使用递归函数在 Python 中实现：

```py
#!/usr/bin/env python

def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

print(factorial(3))

```

调用阶乘函数 n = 3 时。它将返回 n *阶乘（n-1）。 该过程将一直持续到 n =1。如果达到 n == 1，它将返回结果。

## 递归限制

Everytime a function calls itself and stores some memory. Thus, a recursive function could hold much more memory than a traditional function. Python stops the function calls after a depth of 1000 calls. If you run this example:

```py
#!/usr/bin/env python

def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

print(factorial(3000))

```

您将收到错误：

```py
RuntimeError: maximum recursion depth exceeded

```

在其他编程语言中，您的程序可能会崩溃。 您可以通过修改递归调用的数量来解决此问题，例如：

```py
#!/usr/bin/env python
import sys

sys.setrecursionlimit(5000)

def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

print(factorial(3000))

```

但是请记住，阶乘函数的输入仍然有限制。 因此，您应该明智地使用递归。 正如您现在对阶乘问题所了解的那样，递归函数并不是最佳解决方案。 对于其他问题（例如遍历目录），递归可能是一个很好的解决方案。