【问题标题】:Why is my code terminating immediately?为什么我的代码会立即终止?
【发布时间】:2016-07-13 14:23:07
【问题描述】:

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

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

【问题讨论】:

  • 你为什么要进行模数检查?那只会打印出序列中的偶数。
  • 您在运行代码时是否收到任何错误消息?此外,这不是用于打印斐波那契数列的算法... n1n2 不应该递增
  • 这不是斐波那契数列。

标签: java while-loop fibonacci


【解决方案1】:

你的逻辑不正确。

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

现代处理器很快就会计数到 400 万(最多几十毫秒),因此程序似乎立即终止。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        您需要所有偶数斐波那契值。每三个斐波那契是偶数,所以你不需要检查每一个。你可以这样做

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-30
            • 1970-01-01
            • 2015-01-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多