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

为何while循环计算阶乘时结果为0且未正确终止?

问题

我写了一段用while循环计算阶乘的Python代码,代码如下:

inputNum = eval(input("enter number to calculate factorial"))

total = inputNum

j = 1

while j < total and inputNum != 0 :
    j = j + 1
    print("j is", j)
    print("initial total is", total)
    inputNum = inputNum-1
    print("inputNum is", inputNum)
    total = total * inputNum
    print("total is", total)  
    #once you get to j==5, it is greater than inputNum == 3
    #I'm going to redefine while to be while j!=0
print("The factorial of", inputNum, "is", total)

不管输入什么数字,输出的最后四行都是:

initial total is (inputNum!)
inputNum is 0
total is 0
The factorial of 0 is 0

我已经在循环条件里设置了inputNum != 0,为什么程序没法在得到正确结果时停止,最后结果还变成0了?

解答

问题出在两个核心点:

  1. 循环条件逻辑完全错误:你用j < total作为判断条件,但total是不断累积的阶乘结果,不是初始输入的数字。比如输入3,第一次循环后total变成3*2=6,此时j=2,2<6依然成立,循环会持续执行,直到inputNum被减到0。
  2. 执行顺序导致多减一次:循环体里先执行inputNum = inputNum-1,再用这个减后的值去乘total。哪怕inputNum已经是1了,进入循环后会先减到0,然后total *= 0直接把结果清零。

要修复的话,回归阶乘本质:n! = n*(n-1)*...*1,且0!和1!的结果都是1。调整后的代码可以这样写:

input_num = int(input("enter number to calculate factorial: "))

if input_num < 0:
    print("负数没有阶乘")
else:
    total = 1
    current = input_num
    while current > 0:
        total *= current
        current -= 1
    print(f"The factorial of {input_num} is {total}")

如果想保留你原来的变量结构,至少要把循环条件改成判断inputNum是否大于1(因为乘到1就够了),同时调整执行逻辑:

inputNum = int(input("enter number to calculate factorial"))
original_num = inputNum  # 存下原始输入,用于最后输出

total = 1 if inputNum == 0 else inputNum
j = 1

while inputNum > 1 :
    inputNum -= 1
    total *= inputNum
    # 调试打印可保留
    print("j is", j)
    print("initial total is", total // inputNum)
    print("inputNum is", inputNum)
    print("total is", total)
    j += 1

print(f"The factorial of {original_num} is {total}")

内容的提问来源于stack exchange,提问作者granite

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:25:38