我知道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
。并且它在打印列表中的抛出错误。
任何人都可以提出一些建议,使它变得强大。
答案 0 :(得分:0)
这就是这种算法的本质,它们非常需要内存。同样使用int / Integer是一个非常糟糕的主意,因为你很快就会耗尽整数容量(2 * 10 ^ 32 -1)。可能你想要双打,但是你仍然可以走多远。
答案 1 :(得分:0)
1亿个整数大约需要4亿个字节。
这可能比JVM默认的最大堆大小要大。尝试添加命令行开关以分配更多内存。
答案 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();
}
}