使用 Python 生成阶乘数列

43 阅读3分钟

编写一个 Python 函数,以正整数 n 作为输入,递归生成阶乘数列 1!2!3!……n!

  1. 解决方案
# 包装函数,返回阶乘数列
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) 语句将计算结果追加到阶乘数列中。最后,我们返回阶乘数列。