位置:首页 » Python3入门教程 » Python3 递归

Python3 递归 [编辑]

递归的各种例子: “要理解递归,你必须先了解递归”,“一个人他的母亲是人类”。你可能想知道,这是与编程有毛线关系?

您可能要拆一个复杂的问题分解成几个较小的块。如果已经熟悉了循环或迭代,但在某些情况下,递归可能是一个更好的解决方案。在Python中,函数如果它调用自己,具有终止条件就是递归。为什么终止条件?调用自己时可能无法终止。

递归与列表

让我们先从一个非常简单的例子:增加所有数字在列表中。无需递归,这可能是:

我们在这里只需调用 sum 函数,该函数将每个元素的变量相加之后的总和并返回。要做到这一点也可用递归:

如果列表的长度为1则返回列表(终止条件)。否则,它返回元素和调用函数 sum() 减去列表中的一个元素。如果所有调用执行时,它返回达到终止条件,并返回结果(答案)。

阶乘递归

阶乘的数学定义是: n! = n * (n-1)!, 如果 n > 1 and f(1) = 1. 例如:   3! = 3 x 2 x 1 = 6.  我们可以在 Python 使用递归函数实现这一点:

#!/usr/bin/env python
 
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)
 
print factorial(3)

当调用阶乘函数 n = 3.  那么返回:n * factorial(n-1).  这一过程将持续直到 n = 1. 如果 n==1 ,这将返回结果。

递归的限制

每当一个函数调用自身并存储一些内存。 因此,一个递归函数比传统的函数需要更多的内存。 Python会在 1000 次调用的深度后停止函数调用。如果运行下面这个例子:

会得到错误如下:

在其他编程语言,程序可以简单地崩溃。可以通过修改的递归调用次数来解决此问题:

但要记住仍有限制阶乘函数的输入。出于这个原因,应该明智地使用递归。正如现在了解到的阶乘问题,递归函数不是最好的解决方案。 对于其他问题,如遍历目录,递归可能是一个很好的解决方案。