Python 递归函数

递归函数将复杂问题拆分为几个较小的问题。你已熟悉循环或迭代。在某些情况下,递归可能是更好的解决方案。

在 Python 中,如果函数调用自身并具有终止条件,则该函数是递归的。为何需要终止条件?阻止该功能无限调用自身。

Python 递归示例

列表递归

让我们从一个非常基本的示例开始:列表中所有的数字相加。没有递归,这可能是:

#!/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 并返回。要递归地执行此操作:

#!/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 x (n-1)!,如果 n > 1f(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 次调用后停止函数调用。如果你运行此示例:

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

你会收到错误:

RuntimeError: maximum recursion depth exceeded

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

#!/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)

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