递归函数是一种函数,它在其定义中直接或间接地调用自身。递归函数通常用于解决可以分解为更小相似问题的问题,直到达到一个基本情况(base case),该基本情况可以直接解决而不需要进一步递归。
下面以递归求和和因数分解为例,说明如何分解递归函数:
递归求和
def test(x):
print(x)
if not x: 基本情况:列表为空
return 0
else:
a = test(x[1:]) 递归调用,处理列表剩余部分
print(a)
return x + a 返回当前元素与剩余元素的和
test([1, 2, 3, 4, 5])
分解步骤:
1. 当`[1, 2, 3, 4, 5]`赋值给参数`x`时,执行`print(x)`。
2. 判断`x`是否还有元素,因为`x`非空,执行`else`语句。
3. 执行`a = test(x[1:])`,此时`x`变为`[2, 3, 4, 5]`,并递归调用`test`函数。
4. 循环步骤1到3,直到`x`变为空列表`[]`。
5. 最后,返回所有递归调用的结果之和。
递归因数分解
from random import randint
def factors(num, fact=[]):
for i in range(2, int(num0.5) + 1): 从2开始查找因数
if num % i == 0:
fact.append(i) 找到因数,添加到列表中
factors(num // i, fact) 递归调用,处理商
break 找到因数后退出循环
else:
fact.append(num) 如果循环结束没有找到因数,说明num本身是质数
facs = []
n = randint(2, 108)
factors(n, facs)
result = '*'.join(map(str, facs)) 将因数列表转化为字符串并用*连接
if n == eval(result):
print(n, '=', result) 如果因数分解正确,打印结果
分解步骤:
1. 定义一个函数`factors`,它接受一个整数`num`和一个可选参数`fact`,用于存储找到的因数。
2. 使用`for`循环从2开始到`num`的平方根,查找因数。
3. 如果找到因数,将其添加到`fact`列表中,并递归调用`factors`函数处理商。
4. 如果循环结束没有找到因数,说明`num`是质数,将其添加到`fact`列表中。
5. 将`fact`列表中的因数转化为字符串并用`*`连接,形成因数分解的表达式。
6. 如果原始数`n`等于因数分解表达式的计算结果,打印出`n`和它的因数分解形式。
通过这样的分解,我们可以理解递归函数的执行过程,以及它是如何逐步分解问题并到达基本情况的