编写一个 Python 函数,以正整数 n 作为输入,递归生成阶乘数列 1!、2!、3!……n!。
- 解决方案
# 包装函数,返回阶乘数列
def fact_wrapper(n):
lst = [1] # 阶乘数列的初始值
# 递归函数,计算阶乘
def fact(n):
if n == 0 or n == 1:
return 1
else:
a = n * fact(n - 1)
lst.append(a) # 将计算结果追加到阶乘数列
return a
fact(n) # 调用递归函数
return lst # 返回阶乘数列
# 测试代码
print(fact_wrapper(5)) # 输出:[1, 2, 6, 24, 120]
# 使用生成器生成阶乘数列
def factorial(n):
result = 1
for i in range(1, n + 1):
result *= i
yield result # 使用 yield 生成下一个阶乘值
# 测试代码
print(list(factorial(5))) # 输出:[1, 2, 6, 24, 120]
# 使用递归函数生成阶乘数列
def rec_factorial(n):
if n == 1:
return [1] # 阶乘数列的初始值
lst = rec_factorial(n - 1) # 递归调用,计算前 n-1 个阶乘值
n_fac = lst[-1] * n # 计算第 n 个阶乘值
lst.append(n_fac) # 将计算结果追加到阶乘数列
return lst # 返回阶乘数列
# 测试代码
print(rec_factorial(5)) # 输出:[1, 2, 6, 24, 120]
在上面的代码中,我们提供了三种解决方案:使用包装函数和递归函数生成阶乘数列、使用生成器生成阶乘数列,以及使用纯递归函数生成阶乘数列。
- 使用包装函数和递归函数生成阶乘数列时,我们首先定义了一个包装函数
fact_wrapper(),该函数接受一个正整数n作为输入,并调用递归函数fact()来计算阶乘数列。在递归函数fact()中,我们使用if n == 0 or n == 1:语句作为基线情况,当n等于 0 或 1 时,返回 1。对于其他情况,我们使用a = n * fact(n - 1)语句计算当前阶乘值,并使用lst.append(a)语句将计算结果追加到阶乘数列中。最后,我们返回阶乘数列。 - 使用生成器生成阶乘数列时,我们定义了一个生成器函数
factorial(),该函数接受一个正整数n作为输入,并使用yield语句生成阶乘数列。在生成器函数factorial()中,我们首先将result变量初始化为 1,然后使用for i in range(1, n + 1):循环来计算1!、2!、3!……n!。对于每个i值,我们使用result *= i语句计算当前阶乘值,并使用yield result语句生成该阶乘值。最后,我们将生成器函数factorial()返回。 - 使用纯递归函数生成阶乘数列时,我们定义了一个递归函数
rec_factorial(),该函数接受一个正整数n作为输入,并返回阶乘数列。在递归函数rec_factorial()中,我们使用if n == 1:语句作为基线情况,当n等于 1 时,返回[1]。对于其他情况,我们使用lst = rec_factorial(n - 1)语句递归调用rec_factorial()函数,计算前n-1个阶乘值。然后,我们使用n_fac = lst[-1] * n语句计算第n个阶乘值,并使用lst.append(n_fac)语句将计算结果追加到阶乘数列中。最后,我们返回阶乘数列。