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 > 1
且 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 次调用后停止函数调用。如果你运行此示例:
#!/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)
但请记住,阶乘函数的输入仍然存在限制。因此,你应该明智地来使用递归。正如你现在了解的阶乘问题,递归函数不是最佳解决方案。对于其他问题,例如遍历目录,递归可能是一个很好的解决方案。