저는 간단한 자바 메서드를 사용합니다.이 메서드는 특정 숫자의 소수 구분 기호 목록을 계산한다고 가정합니다.이 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 : 자바 힙 공간
처음에는 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. 디버깅 (또는 최소한 디버깅 시연)을 수행 할 수 있다고 생각하지만,이 버그가 이러한 예외로 이어지는 방법은 놀라 울 정도로 미묘합니다. – ruakh
네,하지만 다른 사람의 함수를 모두 가지고 있고, 예제처럼, 초조하게 stackoverflow에 게시했습니다. –
'[주어진 시험 횟수의 반복적이고 재귀적인 처리가] 가정되는 로직 같은'- 재귀와 함께, 당신은 결코 '숫자'의 왼쪽에있는 것을 나눈 것을 발견 한 후에'i'를 증가시키지 않고 (그리고 다시 확인하십시오). – greybeard