在 Java 中搜索 Collat​​z 序列中的最长链,循环未终止

Searching longest chain in Collatz sequence in Java, loop not terminating

我想应用 Collat​​z 序列并将其应用于从 1 到 10^6 的所有数字,并且 return 最大链数需要达到 1。但是,我的问题是我的循环似乎不会在 Eclipse 中终止,我不明白为什么,尽管我希望每一步都完成,但我什至无法在控制台中显示我的所有打印件。

collat​​z 序列按以下规则计算:

这是我目前所拥有的:

public static long collatz() {

    long res = 0;
    long n = 1;
    long count = 0;
    long largestCount = 0;
    long t = 0;

    for (long k = 1; k <= 20; k++) {

        n = k;

        while (n != 1) {

            if ((n % 2) == 0) {
                n = n / 2;
                count = count + 1;
            }

            else {
                n = (3 * n) + 1;
                count = count + 1;

            }

            if (count > largestCount) {
                largestCount = count;
                res = k;
            }
        }
    }

    System.out.println(res);
    return res;

}

您的代码应该 运行 正确。虽然它不是工作代码。 您正在检查条件以查看当前 count 是否大于当前 largest count inside while 循环,这实际上没有意义,因为您需要获取 collat​​z 序列的长度,然后将其与当前最大值进行比较。除此之外,您的代码还不错。 :)

这是我写的东西,如果你有兴趣的话。

final int number = 1000000;

long sequenceLength = 0;
long startingNumber = 0;
long sequence;

for (int i = 2; i <= number; i++) {
    int length = 1;
    sequence = i;
    while (sequence != 1) {
        if ((sequence % 2) == 0) {
            sequence = sequence / 2;
        } else {
            sequence = sequence * 3 + 1;
        }
        length++;
    }

    //Check if sequence is the best solution
    if (length > sequenceLength) {
        sequenceLength = length;
        startingNumber = i;
    }
}
System.out.println(startingNumber);

它运行但它总是打印最后测试的数字,因为你没有重置 count

我还将 count 值的增量从 if/else 语句中移出,因为增量不依赖于 n.[=15= 的值]

而且我已将 largestCount 的更新移到 while 循环之后。

public static long collatz() {

    long res = 0;
    long n = 1;
    long count = 0;
    long largestCount = 0;
    long t = 0;

    for (long k = 1; k <= 20; k++) {

        n = k;
        count = 0; // start every sequence with count = 0

        while (n != 1) {

            if ((n % 2) == 0) {
                n = n / 2;
            }
            else {
                n = (3 * n) + 1;
            }
            count = count + 1;
        }
        if (count > largestCount) {
            largestCount = count;
            res = k;
        }
    }

    System.out.println(res);
    return res;
}

如果您阅读我的解决方案,您会发现为一堆代码行应该做的事情编写注释是如何非常有用的,并且可以使代码自我记录..

Try Online

public static long collatz(int maxN)
{
    long res = 0, n = 1, count = 0, largestCount = 0, t = 0;

    // for K in [1, max-N]
    for (long k = 1; k <= maxN; k++)
    {
        // reset count to zero
        n = k; count = 0;

        // count how many steps to get to 1
        while (n != 1)
        {
            // n = collatz(n)
            n = (n%2==0 ? n/2 : (3*n)+1);

            count++; // count the step
        }

        // check for maximum count
        if (count > largestCount)
        {
            largestCount = count;
            res = k;
        }
    }

    return res; // return maximum solution
}

在 C# 或 Visual basic

中使用 Biginteger 而不是 Long

例如http://herbert-helling.de/VB_Tests/