为什么我的代码立即终止?

Why is my code terminating immediately?

我正在尝试打印出斐波那契数列中所有小于四百万的正数。

public static void main(String[] args) {

    int n1 = 1;
    int n2 = 2;
    int n3 = 0;

    while (n3 <= 4000000) {
        n3 = n1 + n2;
        if (n3 % 2 == 0) {
            System.out.println(n3);
        }
        n1+=1;
        n2+=1;
    }
}

你的逻辑不正确。

如果您在调试器中逐步执行此代码,您会看到 n3never 甚至(什么您在 n3 % 2 == 0) 中测试,因此 if 条件永远不会为真。

现代处理器数到 400 万不需要很长时间(最多几十毫秒)所以看起来程序立即终止。

您的代码不会立即终止,它只是不打印任何内容。 n1 开始时为 1,n2 开始时为 2,总和为 3,为奇数 - 因此未打印。循环的每次迭代都会递增两个数字,给出另一个奇怪的结果,然后再次不打印任何内容。

然而,斐波那契数与偶数无关 - 它们只是系列中前两个数字的总和:

while (n3 <= 4000000) {
    n3 = n1 + n2;
    System.out.println(n3);
    n1 = n2;
    n2 = n3;
}

首先,您没有在循环结束时正确地建立 n1n2。不要只将 1 添加到 n1n2 中。因为您只是在递增 n1n2 中的每一个,所以它们中的一个始终是奇数,而其中一个始终是偶数。这使得 n3 很奇怪,所以它永远不会被打印出来。相反,将 n1 设置为 n2,然后将 n2 设置为 n3

其次,斐波那契数列的所有数字都是正数,因此没有理由在印刷品上放置条件。无论如何,该条件只会打印偶数。删除 if,留下印刷品。

为什么我的代码立即终止?(不符合逻辑)

因为您的代码没有打印任何内容,因为条件 if (n3 % 2 == 0) 始终为假(n3 始终为奇数),删除 if 条件并它不会立即终止,因为打印需要一些时间。

您遇到的问题是您没有计算斐波那契数列。然而,即使你这样做了,它也应该执行得如此之快,你不会看到它在计算结果。

您需要所有偶数的斐波那契值。每三分之一的斐波那契数都是偶数,因此您无需检查每一个。你可以做到

int a = 1;
int b = 1;
int c = a + b;
long sum = 0;
while (c < 4_000_000) {
   sum += c;
   a = b + c;
   b = a + c;
   c = a + b; // skip forward to the next even fibonacci
}

注意:这个下降 % 是昂贵的并且有 1/3 的循环。