为何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了?
解答
问题出在两个核心点:
- 循环条件逻辑完全错误:你用
j < total作为判断条件,但total是不断累积的阶乘结果,不是初始输入的数字。比如输入3,第一次循环后total变成3*2=6,此时j=2,2<6依然成立,循环会持续执行,直到inputNum被减到0。 - 执行顺序导致多减一次:循环体里先执行
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
相关产品推荐
相关产品推荐

