У меня есть простой метод 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 heap space
Первоначально я думал, что это связано с тем, что инициализация 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;
}
метод работает для макс значений (после изменения подписи к Integer, работает на целое значение макс тоже). Логика как предполагается, одна и та же, только рекурсивная реализация второй делает разницу ...
+1. Я думаю, что вы могли бы лучше отлаживать работу (или, по крайней мере, демонстрировать вашу отладку), но удивительно тонко, как эта ошибка приводит к этому исключению. – ruakh
Да, но я получил обе функции от кого-то еще, как пример, и с нетерпением отправил на stackoverflow, вместо того, чтобы заставить себя работать :) –
'Логика [итеративная и рекурсивная обработка любого данного предполагаемого пробного делителя] должна быть то же самое - с рекурсией, вы _never_ получаете, чтобы увеличивать (и перечитывать) 'i' после обнаружения' i' делит то, что осталось от 'number'. – greybeard