如何将我的 Collat​​z 序列代码停止在 1?

How can I stop my Collatz Sequence code at 1?

我尝试使用 while 循环实现 Collat​​z 序列,但我无法在 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.

最后,我建议多注意正确缩进代码, 并像我一样在运算符周围添加空格, 否则代码很难阅读、理解和调试。

您的循环在 Collat​​z 序列中执行两个步骤,而不是一个。即使a1,它也会继续进入第二个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);
        }
}