You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python自定义阶乘函数返回值为正确结果两倍的问题排查

问题根因

你遇到的固定两倍结果不是单一问题导致的,是两个逻辑错误叠加后的巧合,拿你注释里举的输入4(正确阶乘结果为24,你的代码输出48)逐行执行就能定位:

  1. 首先你对Pythonrange的边界规则理解有误:range(start, end)是左闭右开区间,只会返回大于等于start、小于end的整数,不会包含end本身。你写的r = range(1, l_adj_x)在输入为4时l_adj_x=3,实际循环k的取值只有1、2,根本不会运行到你注释里写的k=3、n=1的第三次迭代。
  2. 其次你的累积乘积存在重复计算:循环里你已经把当前轮次的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:09:16