摘要:在本节中,你将了解 Python 递归函数,以及如何使用它们来简化你的代码。
递归函数简介
递归函数是一种会不断调用自身,直到满足特定条件才停止调用的函数。
下面的 fn()
函数就是一个递归函数,因为它在函数内部调用了自身:
def fn():
# ...
fn()
# ...
在 fn()
函数中,#...
表示其他代码。
此外,一个递归函数需要有一个停止自身调用的条件。所以你需要添加一个像这样的 if
语句:
def fn():
# ...
if condition:
# stop calling itself
else:
fn()
# ...
通常,你会使用递归函数将一个难以解决的大问题分解成若干个易于解决的小问题。
在编程中,你会经常发现递归函数被应用于诸如树、图和二分查找等数据结构和算法中。
Python 递归函数示例
下面我们来看一些使用 Python 递归函数的例子。
一个简单的递归函数示例
假设你需要开发一个倒计时函数,它能从指定的数字开始倒数到零。
例如,如果你调用这个从 3 开始倒计时的函数,它将输出如下内容:
3
2
1
下面定义了 count_down()
函数:
def count_down(start):
""" Count down from a number """
print(start)
如果你现在调用 count_down()
函数:
count_down(3)
……它将只显示数字3。
要显示数字3、2和1,你需要:
首先,调用
count_down(3)
来显示数字3。其次,调用
count_down(2)
来显示数字2。最后,调用
count_down(1)
来显示数字1。
为了做到这一点,在 count_down()
函数内部,你需要定义一个逻辑,以参数2和1来调用 count_down()
函数。
要实现这一点,你需要让 count_down()
函数成为递归函数。
下面定义了一个递归的 count_down()
函数,并通过传入数字3来调用它:
def count_down(start):
""" Count down from a number """
print(start)
count_down(start-1)
count_down(3)
如果你执行这个程序,你将会看到以下错误:
RecursionError: maximum recursion depth exceeded while calling a Python object
原因是 count_down()
函数会无限地调用自身,直到系统将其停止。
因为当数字减到零时你需要停止倒计时。要做到这一点,你可以添加一个像这样的条件:
def count_down(start):
""" Count down from a number """
print(start)
# call the count_down if the next
# number is greater than 0
next = start - 1
if next > 0:
count_down(next)
count_down(3)
输出:
3
2
1
在这个例子中count_down()
函数仅当下一个数字大于零时才会调用自身。换句话说,如果下一个数字是零,它就会停止调用自身。
使用递归函数计算一个数列的和
假设你需要计算一个数列的和,例如从 1 到 100 的和。一个简单的做法是使用 range()
函数配合 for
循环:
def sum(n):
total = 0
for index in range(n+1):
total += index
return total
result = sum(100)
print(result)
输出:
5050
为了运用递归技术,你可以按如下方式计算从 1 到 n 的数列的和:
sum(n) = n + sum(n - 1)
sum(n - 1) = n - 1 + sum(n - 2)
…
sum(0) = 0
只要 sum()
函数的参数大于零,它就会不断地调用自身。
下面定义了 sum()
函数的递归版本:
def sum(n):
if n > 0:
return n + sum(n-1)
return 0
result = sum(100)
print(result)
输出:
5050
这个递归函数要短得多,而且可读性更强。
如果你使用三元运算符sum()
函数会更加简洁:
def sum(n):
return n + sum(n-1) if n > 0 else 0
result = sum(100)
print(result)
输出:
5050
总结
递归函数是一种会不断调用自身,直到满足特定条件才停止调用的函数。
并且,递归函数总是存在一个使其停止自身调用的条件。