Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
项目Euler 14-Java StackOverflower错误_Java_Stack Overflow - Fatal编程技术网

项目Euler 14-Java StackOverflower错误

项目Euler 14-Java StackOverflower错误,java,stack-overflow,Java,Stack Overflow,对于那些不熟悉这个问题的人来说,这是一个问题 我得到一个StackOverflower错误,代码如下: public class LongestCollatzSequence { static int count = 1; public static void main(String[] args) { final int range = 1000000; int maxSeq = 0; List<Integer> chainList = new Arra

对于那些不熟悉这个问题的人来说,这是一个问题

我得到一个StackOverflower错误,代码如下:

public class LongestCollatzSequence {

static int count = 1;

public static void main(String[] args) {
    final int range = 1000000;
    int maxSeq = 0;
    List<Integer> chainList = new ArrayList<Integer>();

    for(int i = 1; i <= range; i++) {
        generateSequence(i);
        if(chainList.isEmpty()) {
            chainList.add(count);
            count = 1;
        } else if(!chainList.contains(count) && count > Collections.max(chainList)) {
            chainList.clear();
            chainList.add(count);
            maxSeq = i;
            count = 1;
        } 
    }
    System.out.println("Sequence starting number: "+maxSeq);
}

private static void generateSequence(int num) {
    if(num == 1) {
        return;
    }
    if(num % 2 == 0) {
        count++;
        generateSequence(num/2);
    } else {
        count++;
        generateSequence(num*3+1);
    }
}
public类LongestCollatzSequence{
静态整数计数=1;
公共静态void main(字符串[]args){
最终整数范围=1000000;
int maxSeq=0;
List chainList=新建ArrayList();
对于(int i=1;i Collections.max(chainList)){
clear();
链表。添加(计数);
maxSeq=i;
计数=1;
} 
}
System.out.println(“序列起始号:+maxSeq”);
}
私有静态void generateSequence(int num){
如果(num==1){
返回;
}
如果(数值%2==0){
计数++;
生成序列(num/2);
}否则{
计数++;
生成顺序(num*3+1);
}
}
}

高水位流量:

-对于数字2-100000,为该数字生成collatz序列。 -链表是存储为每个数字生成的序列长度的列表,即数字13的序列大小为10(参见示例)。
-如果当前序列大小大于链列表中的最大值,请清除链列表并添加新的最大值,同时将i的值存储在maxReq中,以记住生成最长链的起始编号。

有趣的问题,但java中的int限制为2^31-1。您可以使用long或BigInteger对该限制进行crox

  private static void generateSequence(long num) {
    if (num == 1) {
        return;
    }
    if (num % 2 == 0) {
        count++;
        generateSequence(num / 2);
    } else {
        count++;
        generateSequence(num * 3 + 1);
    }
}

完整发布确切的异常(包括堆栈跟踪)。使用迭代而不是递归。你在哪一行接受这个错误哦,来吧,伙计们。我们不需要堆栈跟踪或错误的精确行。堆栈溢出是堆栈溢出。通过避免多次生成数字序列,可以大大提高性能。一旦获得序列长度,请将其缓存为一个数字。您可以使用
地图
。然后在另一个序列中,如果你得到中间的数字,你已经计算了它的长度,你可以停在那里,然后使用它。顺便说一句,你不应该在这里使用递归。只需遵循迭代方法。您将从1000000开始的最大值。我怀疑任何一个都会打破整数溢出。我遇到的最高值约为4000000 IIRC。哦,我明白了。因此,可能是
int
溢出在某个点使
num
为负值,然后将进程发送到一个循环中+1.为了发现这一点。但即使使用此解决方案,
num
也有可能变为负值,但没有进入一个周期。似乎唯一正确的做法是将
num
设置为
biginger
,而不是
int
long
。是的,biginger是最好的。我用了很长时间只是为了测试overflow@DavidWallace对于给定的范围,
long
就足够了。我这样说是因为我已经解决了这个问题但即使程序终止,也无法证明溢出没有发生。你真的不知道
long
是否足够,除非你在每一步都检查
num