3

在做实现Collat​​z 猜想的 Java 作业时,我想到了一个不同的目标,即找到最长的 Collat​​z 序列。我的程序计算步骤如下:

public class Collatz {

static int count = 0;

    static void bilgi (int n){

        int result = n;
        System.out.println("Result: "+result+ " Step: "+count);

        if (result <= 1) {
            result = 1;
        } else if (result%2 == 0){
            result = result/2;
            count = count + 1;
            bilgi(result);

        } else {
            result = (result*3)+1;
            count = count + 1;
            bilgi(result);
        }
    }

    public static void main(String[] args) {
        bilgi(27);
    }

}

我想找到最高的步数。

4

4 回答 4

3
static int bilgi(int n) {
    int result = n;
    if (result <= 1) return 1;
    if (result % 2 == 0) return 1+bilgi(result/2);
    return 1+bilgi(3*result+1);
}

然后你收集bilgi(i)调用的结果并选择最大值。

于 2012-11-02T07:46:18.533 回答
2

任何小于 1 亿的初始起始数字的最长级数是 63,728,127,有 949 步。对于小于 10 亿的起始数字,它是 670,617,279,有 986 个步骤,对于小于 100 亿的数字,它是 9,780,657,630,有 1132 个步骤

来源:http ://en.wikipedia.org/wiki/Collat​​z_conjecture

于 2013-08-31T02:01:05.870 回答
0

如果您正在寻找 1 到 100 之间的最大值,您可以替换:

public static void main(String[] args) {
    bilgi(27);
}

和 :

public static void main(String[] args) {

    static int maxcountsofar = 0;
    static int start = 0;
    static int thisone = 0;
    for (int iloop = 1; iloop <= 100; iloop++)
    {
       thisone = bilgi(iloop);
       if (thisone > maxcountsofar)//if this one is bigger than the highest count so far then
      {
        start = iloop;//save this information as best so far
        maxcountsofar = thisone;
      }
    }
    System.out.println("Result: " + start.Tostring() + " Step: " + maxcountsofar.Tostring() );
    //I know this is a really old post but it looked like fun.

}

/* 另外,将 println() 从 bilgi() 函数中取出,它会为遇到的每个步骤生成一行,这将毫无价值且非常耗时。

使用 Vesper 的 bigli() 因为它比你的快得多。*/

于 2014-07-29T20:08:55.157 回答
0

我知道这是一个老问题,但我只是在解决它,我建议任何这样做的人,只需使用数组列表并获取 .size(),我就是这样做的,因为我也想查看这些值.

于 2016-06-27T02:35:03.247 回答