没有递归给出内存错误

时间:2014-09-29 22:15:44

标签: java out-of-memory fibonacci

我知道memoization是玩Fibonacci系列的更好方法。今天我用这种方式编写了程序 -

    private void printFibonacci(int lengthOfSeries) {

    int lastNumb = 1;
    int secondLastNumb = 1;

    List<Integer> fabArray = new ArrayList<Integer>();

    if (lengthOfSeries == 0) {
        System.out.println("Please enter number to print series.");

    } else {

        fabArray.add(secondLastNumb);
        fabArray.add(lastNumb);

        while (fabArray.size() < lengthOfSeries) {

            lastNumb = fabArray.get(fabArray.size() - 1);
            secondLastNumb = fabArray.get(fabArray.size() - 2);

            fabArray.add(lastNumb + secondLastNumb);
        }
    }
    System.out.println(fabArray);
}

这很好用。但是当输入数字很高(比如100,000,000)时,它会抛出outOfMemoryerror。并且它在打印列表中的抛出错误。

任何人都可以提出一些建议,使它变得强大。

4 个答案:

答案 0 :(得分:0)

这就是这种算法的本质,它们非常需要内存。同样使用int / Integer是一个非常糟糕的主意,因为你很快就会耗尽整数容量(2 * 10 ^ 32 -1)。可能你想要双打,但是你仍然可以走多远。

答案 1 :(得分:0)

1亿个整数大约需要4亿个字节。

这可能比JVM默认的最大堆大小要大。尝试添加命令行开关以分配更多内存。

这里有一些迹象:http://publib.boulder.ibm.com/infocenter/realtime/v2r0/index.jsp?topic=%2Fcom.ibm.rt.doc.20%2Fdiag%2Fappendixes%2Fdefaults.html

答案 2 :(得分:0)

根据我的评论,一个简单的实现将是:

int[] fabArray = new int[] {1, 1, 0};
for (int i = 0; i < lengthOfSeries; i++) {
    fabArray[2] = fabArray[1] + fabArray[0];
    System.out.print(fabArray[0] + ", ");
    fabArray[0] = fabArray[1];
    fabArray[1] = fabArray[2];
}
// End of line
System.out.println();

答案 3 :(得分:0)

导致OutOfMemoryError的ArrayList的增长,您不需要打印列表或终止循环。以下代码应该没有内存问题:

 private void printFibonacci(int lengthOfSeries) {

    int lastNumb = 1;
    int secondLastNumb = 1;
    int count = 2;

    if (lengthOfSeries == 0) {
        System.out.println("Please enter number to print series.");

    } else {

        System.out.print("1, 1");

        while (count < lengthOfSeries) {
            int next = lastNumb + secondLastNumb;
            System.out.print(", " + next);
            secondLastNumb = lastNumb;
            lastNumb = next;
            //Updated
            count = count+1;
        }
        System.out.println();
    }

}