任何人都可以向我解释为什么我会收到Stack Overflow Error?

时间:2013-12-20 19:48:53

标签: java recursion

我试图完成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);
    }
}
}

4 个答案:

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

}