我有一个简单的Java方法,它假设计算一定数量的素数列表。这个Java函数为什么会崩溃?
public class Factors {
public static List<Integer> fac(List<Integer> factors, int number) {
if(number < 2) {
throw new IllegalArgumentException("Number must be greater than one");
}
for (int i = 2; i <= number; i++) {
while (number%i == 0) {
factors.add(i);
number /= i;
}
}
return factors;
}
public static void main(String [] args)
{
final long startTime = System.currentTimeMillis();
ArrayList<Integer> factors = new ArrayList<>();
System.out.println(fac(factors, 2147483647));
final long endTime = System.currentTimeMillis();
System.out.println("Total execution time: " + (endTime - startTime));
}
}
这段代码工作正常,除非您将Integer.MAX_VALUE加入它;在这种情况下给:
java.lang.OutOfMemoryError:Java堆空间
最初,我想,这是因为,ArrayList初始化是在一个方法内,但在删除后,同样的错误仍然存在。
此外,这样的:
public static List<Long> facrec2(List<Long> list, long number) {
if (number < 2) {
return list;
}
if (number == 2) {
list.add(2L);
return list;
}
for (long i = 2; i <= number; i++) {
while (number % i == 0) {
number /= i;
list.add(i);
return facrec2(list, number);
}
}
return null;
}
方法适用于最大值(改变签名整数后,适用于整数最大值太)。两者的逻辑假设是一样的,只有递归执行的第二个使得区别...
+1。我认为你可以在调试方面做得更好(或者至少可以证明你的调试),但是这个bug如何导致这个异常是令人惊讶的微妙。 – ruakh
是的,但我从其他人那里获得了这两个功能,只是作为一个例子,并且不耐烦地发布在stackoverflow上,而不是让自己工作:) –
'[对任何给定的审判除数的迭代和递归处理应该]的逻辑是与递归相同,在发现'i'之后,你_never_开始增加(并重新检查)'i',将'number'剩下的部分分开。 – greybeard