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

Java 为什么我的代码会立即终止?,java,while-loop,fibonacci,Java,While Loop,Fibonacci,我试着打印出斐波那契序列中小于400万的所有正数 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); }

我试着打印出斐波那契序列中小于400万的所有正数

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;
    }
}
publicstaticvoidmain(字符串[]args){
int n1=1;
int n2=2;
int n3=0;

而(n3您的逻辑不正确

如果您在调试器中单步执行此代码,您将看到
n3
从不偶数(您在
n3%2==0
中测试的内容),因此
If
条件永远不会为真


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

您的逻辑不正确

如果您在调试器中单步执行此代码,您将看到
n3
从不偶数(您在
n3%2==0
中测试的内容),因此
If
条件永远不会为真


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

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

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

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

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

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

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

while(n3首先,你没有在循环结束时正确地建立
n1
n2
。不要只将
1
添加到
n1
n2
中。因为你只是在增加
n1
n2
中的每一个,其中一个始终是奇数,而其中一个是偶数。这使得
n3
奇数,因此从不打印。相反,将
n1
设置为
n2
,然后将
n2
设置为
n3


其次,斐波那契序列的所有数字都是正数,因此没有理由在打印上设置条件。无论如何,该条件将只打印偶数。如果
,请删除
,保留打印。

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


其次,斐波那契序列的所有数字都是正数,因此没有理由在打印上设置条件。无论如何,该条件将只打印偶数。如果删除
,则保留打印。

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


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

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


因为您的代码没有打印任何内容,因为条件
if(n3%2==0)
总是false(
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
}
inta=1;
int b=1;
INTC=a+b;
长和=0;
而(c<4_000_000){
总和+=c;
a=b+c;
b=a+c;
c=a+b;//向前跳到下一个偶数斐波那契
}

注意:这是一个非常昂贵且有1/3循环的
%

问题是您没有计算斐波那契数。但是,即使您计算了斐波那契数,它的执行速度也应该非常快,您也看不到它在计算结果

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

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
}
inta=1;
int b=1;
INTC=a+b;
长和=0;
而(c<4_000_000){
总和+=c;
a=b+c;
b=a+c;
c=a+b;//向前跳到下一个偶数斐波那契
}

注意:这会删除一个
%
,它很昂贵,并且有1/3的循环。

为什么要进行模检查?这只会打印出序列中的偶数。运行代码时是否收到任何错误?此外,这不是用于打印斐波那契序列的算法…n1和n2不应该是递增的校正那不是斐波那契序列。你为什么要做模检查?那只会打印出序列中的偶数。你在运行代码时收到任何错误吗?而且,这不是用来打印斐波那契序列的算法…n1和n2不应该增加这不是斐波那契序列。