为什么这个while循环与for循环在python中查找数字的阶乘没有相同的用法?

问题描述

我是编程和此代码的新手:

def factorial(n):
  number = 1
  result = 1
  for x in range(n):
    result *= number
    number += 1
  return result 

可以很好地找到数字 n 的阶乘。

但是,一旦我将代码更改为:

def factorial(n):
  number = 1
  result = 1
  while number < n:
    result *= number
    number += 1
  return result 

当它看起来是同一段代码时(至少对我而言),它无法按预期工作。

谁能解释为什么这个“while”循环与“for”循环的工作方式不同?谢谢。

解决方法

for x in range(n)0 迭代到 n - 1

while number < n1 迭代到 n - 1,少一次迭代。

如果将 while 更改为 while number - 1 < n,两个循环将相等。

,
Consider following examples
n = 5
number = 1
for x in range(n):
    print("foo")
    number += 1

输出 foo 5 次,同时

n = 5
number = 1
while number < n:
    print("foo")
    number += 1

输出 foo 4 次。如果您想了解更多信息,请搜索一对一错误。这就是为什么建议在您事先知道运行次数的情况下使用 for 的原因。

,

让我们看看发生的事情的不同:

In [6]: def factorial(n):
   ...:   number = 1
   ...:   result = 1
   ...:   for x in range(n):
   ...:     print(f"multiplying {result} by {number}")
   ...:     result *= number
   ...:     number += 1
   ...:   return result
   ...:

In [7]: factorial(5)
multiplying 1 by 1
multiplying 1 by 2
multiplying 2 by 3
multiplying 6 by 4
multiplying 24 by 5
Out[7]: 120

In [9]: def factorial(n):
   ...:   number = 1
   ...:   result = 1
   ...:   while number < n:
   ...:     print(f"multiplying {result} by {number}")
   ...:     result *= number
   ...:     number += 1
   ...:   return result
   ...:

In [10]: factorial(5)
multiplying 1 by 1
multiplying 1 by 2
multiplying 2 by 3
multiplying 6 by 4
Out[10]: 24

我们可以看到第二个循环运行的时间少了 1,这是因为 range(n) 从 0 开始,而不是从 1 开始,所以你的循环又运行了一次