为什么我的代码立即终止?
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;
}
}
你的逻辑不正确。
如果您在调试器中逐步执行此代码,您会看到 n3
是 never 甚至(什么您在 n3 % 2 == 0
) 中测试,因此 if
条件永远不会为真。
现代处理器数到 400 万不需要很长时间(最多几十毫秒)所以看起来程序立即终止。
您的代码不会立即终止,它只是不打印任何内容。 n1
开始时为 1,n2
开始时为 2,总和为 3,为奇数 - 因此未打印。循环的每次迭代都会递增两个数字,给出另一个奇怪的结果,然后再次不打印任何内容。
然而,斐波那契数与偶数无关 - 它们只是系列中前两个数字的总和:
while (n3 <= 4000000) {
n3 = n1 + n2;
System.out.println(n3);
n1 = n2;
n2 = n3;
}
首先,您没有在循环结束时正确地建立 n1
和 n2
。不要只将 1
添加到 n1
和 n2
中。因为您只是在递增 n1
和 n2
中的每一个,所以它们中的一个始终是奇数,而其中一个始终是偶数。这使得 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 的循环。
我正在尝试打印出斐波那契数列中所有小于四百万的正数。
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;
}
}
你的逻辑不正确。
如果您在调试器中逐步执行此代码,您会看到 n3
是 never 甚至(什么您在 n3 % 2 == 0
) 中测试,因此 if
条件永远不会为真。
现代处理器数到 400 万不需要很长时间(最多几十毫秒)所以看起来程序立即终止。
您的代码不会立即终止,它只是不打印任何内容。 n1
开始时为 1,n2
开始时为 2,总和为 3,为奇数 - 因此未打印。循环的每次迭代都会递增两个数字,给出另一个奇怪的结果,然后再次不打印任何内容。
然而,斐波那契数与偶数无关 - 它们只是系列中前两个数字的总和:
while (n3 <= 4000000) {
n3 = n1 + n2;
System.out.println(n3);
n1 = n2;
n2 = n3;
}
首先,您没有在循环结束时正确地建立 n1
和 n2
。不要只将 1
添加到 n1
和 n2
中。因为您只是在递增 n1
和 n2
中的每一个,所以它们中的一个始终是奇数,而其中一个始终是偶数。这使得 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 的循环。