Java 为什么我的代码会立即终止?
我试着打印出斐波那契序列中小于400万的所有正数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); }
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不应该增加这不是斐波那契序列。