对于那些不熟悉问题的人,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,为该数字生成一个collatz序列。 链表是存储为每个数字生成的序列长度的列表,即数字13的序列大小是10(参见示例)。 - 如果当前序列大小大于链表中的最大值,清除链表并添加新的最大值,也将i的值存储在maxReq中,以记住产生最长链的起始号。
答案 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);
}
}