我有一個簡單的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