结束冰雹序列 (Java)

Ending a Hailstone Sequence (Java)

对于我的 class,我必须编写一个程序,我们必须从任意数字创建冰雹序列 (Hailstone 是一种数学理论,如果你将偶数除以 2,然后将奇数乘以 3 再加 1,那么你最终会得到无穷无尽的 4,2,1,4,2,1)

我的提示是在4,2,1,4,2,1这两个序列之后就把程序砍掉。目前我的代码正在运行,我可以按此模式的一个序列将其切断。但是,我无法找出一个循环以在最后停止它。我的问题是,我是否设置了代码以便无法捕捉到第二个序列?

代码:

Scanner inData = new Scanner(new File("test.txt"));
    ArrayList<Integer> list= new ArrayList<Integer>();

    while(inData.hasNext())
            {
                int num=inData.nextInt();
                int var=list.size();
                list.add(num);

                while(num>1)
                {
                    if(num%2==0)
                    {
                        num/=2;
                        list.add(num);


                    }

                    else
                    {
                        num=(num*3)+1;
                        list.add(num);
                    }
                }


                System.out.print(list);
            }

}

文本输入为 10 的输出应为: [10, 5, 16, 8, 4, 2, 1, 4, 2, 1] 目前: [10, 5, 16, 8, 4, 2, 1]

我建议编写一个方法,当您的列表以 4,2,1,4,2,1 结尾时 returns 为真:

private boolean finished(List<Integer> list) {
    int len = list.length();

    // check for minimum of 6 entries
    if(len < 6) {
        return false;
    }

    return list.get(len-1) == 1
        && list.get(len-2) == 2
        && list.get(len-3) == 4
        && list.get(len-4) == 1
        && list.get(len-5) == 2
        && list.get(len-6) == 4;
}

然后将您的 while 循环更改为:

while(num>1 && !finished(list)) {

我相信您是在问如何检查正在构建的列表中的数字序列。

这可以通过多种方式完成。可能最简单的就是在您正在构建的列表中搜索模式。

static final List<Integer> PATTERN = Arrays.toList(4, 2, 1, 4, 2, 1);
if (Collections.indexOfSublist(list, PATTERN) >= 0) {
    ...
}

这不是非常有效 - 它会在每次迭代时进行详尽搜索。我无法想象这对您来说会是个问题,但如果是,则使用 List.subList 来搜索最后的 PATTERN.size() 个元素。

没错。试试这个,我认为它会起作用:

Scanner inData = new Scanner(new File("test.txt"));
ArrayList<Integer> list= new ArrayList<Integer>();

while(inData.hasNext())
{
    int num=inData.nextInt();
    int seq = 2
    list.add(num);

    while((num>1)&&(seq>0))
    {
        if(num%2==0)
        {
            num/=2;
            list.add(num);
        }
        else
        {
            if(num==1){
                seq -= 1;
            }
            num=(num*3)+1;
            list.add(num);
        }
    }

    System.out.print(list);
}