
该教程讲解如何编写一个函数,接收单个整数参数 n,返回包含 0! 到 n! 的完整阶乘列表,并修正原始代码中的语法错误、逻辑偏差与命名规范问题。
要实现 RangeFactorial(10) 这样的调用方式并返回 [0!, 1!, 2!, ..., 10!] 的列表,需明确两点:
- 阶乘计算函数(如 factorial(n))应独立、健壮,且正确处理边界值(尤其是 0! = 1);
- 范围阶乘函数(如 range_factorial(n))应遍历 0 到 n(含),逐个调用阶乘函数,并将结果收集为列表后返回。
首先,修正原始代码中的关键问题:
- 缺少函数定义后的冒号 :;
- range(1, n+1) 忽略了 0!(数学上定义为 1),导致结果不完整;
- 原始 RangeFactorial 实际只计算单个 n!,而非“范围内的所有阶乘”,语义与需求不符;
- Python 命名惯例推荐使用小写字母加下划线(snake_case),故改用 factorial 和 range_factorial。
以下是完整、可运行的实现:
def factorial(n):
"""计算非负整数 n 的阶乘,支持 n = 0"""
if n < 0:
raise ValueError("阶乘未定义于负数")
result = 1
for x in range(1, n + 1):
result *= x
return result
def range_factorial(n):
"""返回包含 0! 到 n! 的列表(共 n+1 个元素)"""
return [factorial(i) for i in range(n + 1)]
# 示例调用
print(range_factorial(5))
# 输出: [1, 1, 2, 6, 24, 120]✅ 关键说明:
- range(n + 1) 确保包含 0 到 n(共 n+1 个数),满足“从 0 开始”的要求;
- 使用列表推导式 [factorial(i) for i in range(n + 1)] 简洁高效,等价于手动 append 循环;
- factorial(0) 正确返回 1(因 range(1, 0+1) 为空,循环不执行,result 保持初始值 1);
- 添加输入校验,提升鲁棒性(可选但推荐)。
? 进阶提示:
若追求更高性能(尤其对大 n),可改用动态规划避免重复计算:
def range_factorial_optimized(n):
if n < 0:
raise ValueError("n 必须为非负整数")
if n == 0:
return [1]
result = [1] # 0! = 1
current = 1
for i in range(1, n + 1):
current *= i
result.append(current)
return result此版本时间复杂度为 O(n),空间 O(n),比多次调用 factorial() 更高效。
总结:函数职责应清晰分离——factorial 负责单值计算,range_factorial 负责批量生成与封装。遵循此结构,代码更易读、可测、可维护。










