java - 项目 Euler 14 - Java StackOverflowError

标签 java stack-overflow

对于那些不熟悉该问题的人,here是的。

我收到一个带有以下代码的 StackOverflowError:

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);
    }
}

}

高级流程:

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

最佳答案

有趣的问题,但是java中的int被限制为2^31-1,你可以使用long或BigInteger来打破这个限制

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

关于java - 项目 Euler 14 - Java StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21066549/

相关文章:

c++ - 大小为 1 MB 的数组

java - 字节帧缓冲区数组填充命令的堆栈溢出问题

c++ - 找出哪个对象/数组使用最多的堆栈内存

java.lang.ClassCastException : Creating a synchronized Linked List 异常

java - 泛型 Java 和类型参数的阴影

java - Jframe 和 Jpanel 大小不起作用

python - 当解释器循环本身是递归的时,蹦床的堆栈安全性

C++ 银行程序不工作堆栈溢出

java - 调用 SQL 过程 : SQL exception - code: 6550 ORA-06550

java - 如何在Java套接字编程中解析index.html文件中包含的style.css的路径