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

时间:2016-03-25 19:21:57

标签: java while-loop fibonacci

我正在尝试打印出低于四百万的Fibonacci序列的所有正数。

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;
    }
}

5 个答案:

答案 0 :(得分:6)

你的逻辑错误。

如果您在调试器中单步执行此代码,您会看到n3 从不 甚至(您在{{1}中测试的内容}}),所以n3 % 2 == 0条件永远不会成立。

现代处理器不需要很长时间就能达到400万(最多几十毫秒),因此程序似乎会立即终止。

答案 1 :(得分:3)

您的代码不会立即终止,它不会打印任何内容。 n1从1开始,n2开始为2,总和为3,这是奇数 - 因此不会打印。循环的每次迭代都会增加两个数字,从而产生另一个奇数结果,并再次打印任何数据。

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

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

答案 2 :(得分:2)

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

其次,Fibonacci序列的所有数字都是正数,因此没有理由在打印上放置条件。无论如何,这种情况只打印偶数。删除if,留下打印件。

答案 3 :(得分:0)

为什么我的代码会立即终止?(不适用于逻辑)

由于条件if (n3 % 2 == 0)始终为假(n3始终为奇数),因此您的代码未打印任何内容, 删除if条件并且不会立即终止< / em> 因为打印需要一些时间。

答案 4 :(得分:0)

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

您需要所有均匀的Fibonacci值。每三个斐波纳契都是如此,所以你不需要检查每一个。你可以做到

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的循环。