我试图完成Project Euler question并试图做一个递归解决方案,但我得到了堆栈溢出错误,似乎无法找出原因。
任何帮助都会很棒。
由于
public class Collatz {
public static void main(String[] args) {
List<Integer> length = new ArrayList<Integer>();
for(int i = 13; i < 1000000; i++){
length.add(collat(i, 0));
}
}
public static int collat(int x, int c){
if(x == 1){
return c;
}
if(x % 2 == 0){
return collat(x/2, c + 1);
}else{
return collat((3 * x) + 1, c + 1);
}
}
}
答案 0 :(得分:4)
Sean M.是正确的;整数溢出正在发生。 That answer应标记为已接受。
答案 1 :(得分:2)
看起来您遇到了整数溢出。我刚在collat()
函数中添加了这个简单的检查。
if(x < 0)
System.out.println("Overflow");
在the sequence的步骤121发生溢出。使用更大的数据类型可以解决问题。
答案 2 :(得分:0)
因为你的默认堆栈大小已经超过了128k? 增加堆栈大小可以解决这个问题
阅读本文:http://goo.gl/iy77Pr
答案 3 :(得分:0)
你需要多头,而不是整数
Project Euler Question 14 (Collatz Problem)
我建议的解决方案,DP
public class Collatz {
public static void main(String[] args) {
List<Long> length = new ArrayList<Long>();
Map<Long,Long> dict = new HashMap<Long,Long>();
for(int i = 13; i < 1000000; i++){
length.add(collat(i, 0,dict));
}
}
public static long collat(long x, long c, Map<Long,Long> dict){
if(dict.containsKey(x))
{
return dict.get(x);
}
if(x == 1){
dict.put(x, c);
return c;
}
else
{
if(x % 2 == 0){
dict.put(x, collat(x/2, c + 1,dict));
return dict.get(x);
}else{
dict.put(x,collat((3 * x) + 1, c + 1,dict));
return dict.get(x);
}
}
}
}