Python自定义阶乘函数返回值为正确结果两倍的问题排查
问题根因
你遇到的固定两倍结果不是单一问题导致的,是两个逻辑错误叠加后的巧合,拿你注释里举的输入4(正确阶乘结果为24,你的代码输出48)逐行执行就能定位:
- 首先你对Python
range的边界规则理解有误:range(start, end)是左闭右开区间,只会返回大于等于start、小于end的整数,不会包含end本身。你写的r = range(1, l_adj_x)在输入为4时l_adj_x=3,实际循环k的取值只有1、2,根本不会运行到你注释里写的k=3、n=1的第三次迭代。 - 其次你的累积乘积存在重复计算:循环里你已经把当前轮次的
n乘进了累积变量empty,计算n_adj_x时又额外乘了一次当前轮的n,属于重复乘值。
我们逐次走一遍输入4时的循环执行流程,就能看得很清楚:
- 前置变量:
adj_x=4,循环实际仅跑2轮 - 第一轮k=1:
n = 4-1 = 3
初始empty为None,直接赋值empty=3
计算n_adj_x = 4 * 3 * 3 = 36 - 第二轮(最后一轮)k=2:
n =4-2=2
累积更新empty = 3 * 2 =6
计算n_adj_x =4 *6 *2 =48 - 循环提前结束(没有k=3的轮次),打印48,刚好是正确值的2倍。
额外提一句你代码里的边界错误:数学上0的阶乘结果是1,不是0,你当前输入0时返回0的逻辑也是错的。
修正参考
阶乘逻辑不需要绕弯做差值计算,直接从2开始累积乘到输入值即可,修正后的代码如下:
def factorial(x): try: adj_x = int(x) except: print("Invalid Input") return if adj_x < 0: print("Invalid Input") return # 0、1的阶乘都是1,直接作为初始值 res = 1 for i in range(2, adj_x + 1): res *= i print(res)
写循环时注意两个要点:
- 记得range左闭右开的特性,要乘到adj_x本身的话,range的右端点要写
adj_x +1 - 累积变量只需要每次乘当前遍历值即可,不要重复乘已经算入累积结果的变量
内容的提问来源于stack exchange,提问作者Jun Yang
相关产品推荐
相关产品推荐

