如何将我的 Collatz 序列代码停止在 1?
How can I stop my Collatz Sequence code at 1?
我尝试使用 while
循环实现 Collatz 序列,但我无法在 1 处停止序列。代码继续。我尝试了所有的可能性,但我想不出一个解决方案。
import java.util.Scanner;
public class cs{
public static void main(String[] args)throws Exception{
System.out.println("Starting number: ");
Scanner s = new Scanner(System.in);
int a = s.nextInt();
System.out.print(" " + a);
while(a>1)
{
if(a == 1) break; // this is not working though
if((a % 2 ) == 0) {
a = a / 2;
System.out.print(" " + a);
}
Thread.sleep(1000);
if((a % 2) != 0){
a = (a * 3) + 1;
System.out.print(" " + a);
}
Thread.sleep(1000);
}
}
}
问题一定是 a
永远不会等于 1。尝试在每个循环中打印 a
的值,看看它实际等于什么:
while(a > 1)
{
// This line is not required because if a == 1 then the while loop would terminate anyway:
// if(a==1) break; //this is not working though
if((a%2)==0){
a = a/2;
System.out.print(" "+a);
}
Thread.sleep(1000);
if((a%2)!=0){
a = (a*3)+1;;
System.out.print(" "+a);
}
Thread.sleep(1000);
System.out.println("a = " + a); // This checks what the value of a actually is
}
这里的第二个 if
条件应该是第一个条件的 else
:
if((a%2)==0){
// ...
}
// ...
if((a%2)!=0){
像这样:
while (a > 1) {
if ((a % 2) == 0) {
a /= 2;
System.out.print(" " + a);
} else {
a = (a * 3) + 1;
System.out.print(" " + a);
}
}
我还删除了毫无意义的 if (a == 1)
行,
由于 while (a > 1)
条件,
if
永远不会是 true
.
最后,我建议多注意正确缩进代码,
并像我一样在运算符周围添加空格,
否则代码很难阅读、理解和调试。
您的循环在 Collatz 序列中执行两个步骤,而不是一个。即使a
是1
,它也会继续进入第二个if
,然后变成4
,所以循环永远不会终止。相反,您应该使用 else
子句,每次循环迭代只执行一个步骤:
while (a > 1) {
if ((a%2) == 0) {
a = a / 2;
} else {
a = (a * 3) + 1;
}
Thread.sleep(1000);
System.out.print(" " + a);
}
这足以满足您的情况:
while (a > 1 && (a % 2) != 0){
a /= 2;
System.out.print(" " + a);
}
因为如果你看一下 while 条件,你会发现 a
大于 1 ==> 根本不可能是 1,所以不需要第一个 if
声明。
所以你的 class 看起来像:
import java.util.Scanner;
public class cs{
public static void main(String[] args)throws Exception{
System.out.println("Starting number: ");
Scanner s = new Scanner(System.in);
int a = s.nextInt();
System.out.print(" " + a);
while (a > 1 && (a % 2) != 0){
a /= 2;
System.out.print(" " + a);
}
}
我尝试使用 while
循环实现 Collatz 序列,但我无法在 1 处停止序列。代码继续。我尝试了所有的可能性,但我想不出一个解决方案。
import java.util.Scanner;
public class cs{
public static void main(String[] args)throws Exception{
System.out.println("Starting number: ");
Scanner s = new Scanner(System.in);
int a = s.nextInt();
System.out.print(" " + a);
while(a>1)
{
if(a == 1) break; // this is not working though
if((a % 2 ) == 0) {
a = a / 2;
System.out.print(" " + a);
}
Thread.sleep(1000);
if((a % 2) != 0){
a = (a * 3) + 1;
System.out.print(" " + a);
}
Thread.sleep(1000);
}
}
}
问题一定是 a
永远不会等于 1。尝试在每个循环中打印 a
的值,看看它实际等于什么:
while(a > 1)
{
// This line is not required because if a == 1 then the while loop would terminate anyway:
// if(a==1) break; //this is not working though
if((a%2)==0){
a = a/2;
System.out.print(" "+a);
}
Thread.sleep(1000);
if((a%2)!=0){
a = (a*3)+1;;
System.out.print(" "+a);
}
Thread.sleep(1000);
System.out.println("a = " + a); // This checks what the value of a actually is
}
这里的第二个 if
条件应该是第一个条件的 else
:
if((a%2)==0){ // ... } // ... if((a%2)!=0){
像这样:
while (a > 1) {
if ((a % 2) == 0) {
a /= 2;
System.out.print(" " + a);
} else {
a = (a * 3) + 1;
System.out.print(" " + a);
}
}
我还删除了毫无意义的 if (a == 1)
行,
由于 while (a > 1)
条件,
if
永远不会是 true
.
最后,我建议多注意正确缩进代码, 并像我一样在运算符周围添加空格, 否则代码很难阅读、理解和调试。
您的循环在 Collatz 序列中执行两个步骤,而不是一个。即使a
是1
,它也会继续进入第二个if
,然后变成4
,所以循环永远不会终止。相反,您应该使用 else
子句,每次循环迭代只执行一个步骤:
while (a > 1) {
if ((a%2) == 0) {
a = a / 2;
} else {
a = (a * 3) + 1;
}
Thread.sleep(1000);
System.out.print(" " + a);
}
这足以满足您的情况:
while (a > 1 && (a % 2) != 0){
a /= 2;
System.out.print(" " + a);
}
因为如果你看一下 while 条件,你会发现 a
大于 1 ==> 根本不可能是 1,所以不需要第一个 if
声明。
所以你的 class 看起来像:
import java.util.Scanner;
public class cs{
public static void main(String[] args)throws Exception{
System.out.println("Starting number: ");
Scanner s = new Scanner(System.in);
int a = s.nextInt();
System.out.print(" " + a);
while (a > 1 && (a % 2) != 0){
a /= 2;
System.out.print(" " + a);
}
}