分析 Java 中的阶乘循环

Analyzing factorial loop in Java

考虑以下代码:

int number;
double factorial = 1.0;

for(int i=2; i<=5; i++)
{
    factorial *=i;
    System.out.println(number + "! = " + factorial );
}

为什么是输出

2.0
6.0
24.0
120.0

我知道从 2 点开始到 5 点。

factorial *= i;

等同于:

factorial = factorial * i;

假设 factorial1.0i2 :

那么微积分将是:

factorial = 1.0 * 2

以此类推,直到循环结束。

我认为您想使用 long(而不是 double,因为您使用了 double,所以您得到了浮点类型)。阶乘通常是整数类型。像,

long factorial = 1;
for (int i = 2; i <= 5; i++) {
    factorial *= i;
    System.out.println(i + "! = " + factorial);
}

然后我得到(预期的)

2! = 2
3! = 6
4! = 24
5! = 120
factorial *=i; 

表示阶乘 =i*阶乘;

事实变量作用域在循环之外中继,因此它不会在每次循环迭代时重置

所以当 i=2 时阶乘 = 2.0

当i=3时上面计算的那个时间阶乘值为2.0所以阶乘=2.0*3即6

当i=4时阶乘=6*4=24.0

当i=5时阶乘=24*5=120.0

  • 1*2 = 2
  • 2*3=6
  • 6*4 = 24
  • 24*5 = 120

我猜,输出是正确的

1,2,6,24 是先前迭代期间存储在 factorial var 中的结果

2,3,4,5 是循环 i 值

int number;


for(int i=2; i<=5; i++)
{
  double factorial = 1.0;
  factorial *=i;
  System.out.println(number + "! = " + factorial );
}

上面的代码将给出输出 2.0、3.0 ... 因为循环中的每次迭代都会创建新变量 'factorial' 并将其初始化为 1.0

但有

int number;
double factorial = 1.0;

for(int i=2; i<=5; i++)
{
factorial *=i;
System.out.println(number + "! = " + factorial );
}

对于 i=2

factorial = factorial *i // 即。 1.0 * 2 = 2.0;阶乘的新值是 2.0 即。阶乘 = 2.0

我=3

factorial = factorial *3 // 即。 2.0 * 3 =6.0 ;这是阶乘(当 i=1 时)乘以 3

我=4

factorial = factorial(when i=2) * 4 // 即。 6.0 *4 = 24.0