项目Euler 14 - Java StackOverflowError

时间:2014-01-11 19:00:11

标签: 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中,以记住产生最长链的起始号。

1 个答案:

答案 0 :(得分:2)

有趣的问题但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);
    }
}