2012-04-25 4 views
0

의 가장 낮은 값을 얻을 나는 다음과 같은 코드더블 []

을 썼다

내 목표는 doble[] absOfSub의 lowst 값을 얻는 것입니다하지만 라인 compared= Double.compare(d2, d1);

Exception in thread "main" java.lang.StackOverflowError 

왜 오버 플로우에서 다음과 같은 예외 을 제공합니다 그것을 고치는 방법?

당신은 당신의 방법 내부 index의 값을 변경하지 않는

public class TestThe { 
static double[] absOfSub = new double[5]; 
    private static int index=0; 

    private static int compare(int currentIdx, int minIdx) { 
     if(index < absOfSub.length) { 
     if(absOfSub[currentIdx] < absOfSub[minIdx]) { 
      compare(currentIdx + 1, currentIdx); 
     } else { 
      compare(currentIdx + 1, minIdx); 
     } 
     } 
    return minIdx; 
    } 

    public static void main(String[] args) { 
    absOfSub[0]=1000; 
    absOfSub[1]=810; 
    absOfSub[2]=108; 
    absOfSub[3]=130; 
    absOfSub[4]=110; 
double result; 
    int inndex= compare(0,1); 
     System.out.println(absOfSub[inndex]); 

    } 
} 
+1

코드가 수정 될 수 있지만 Java에서 재귀를 통해 'min '을 구현하는 것은 부 자연스러운 일입니다. 단순한 반복 솔루션으로 재 작업하지 않는 이유는 무엇입니까? –

+0

@MarkoTopolnik 더 많은 설명? 어떻게하면 더 간단하게 만들 수 있을까요? – lonesome

답변

5

이 간단하고 우아한 해결책은 어떻습니까?

static double min(double... ds) { 
    double min = Double.POSITIVE_INFINITY; 
    for (double d : ds) min = Math.min(min, d); 
    return min; 
} 

public static void main(String[] args) { 
    System.out.println(min(-5.2, 0, -10.1, 3)); 
} 

재귀 솔루션 (권장하지 않음!) :

static double minRecur(double... ds) { 
    return minRecur(ds, 0, Double.POSITIVE_INFINITY); 
} 
static double minRecur(double[] ds, int i, double runningMin) { 
    return (i < 0 || i >= ds.length)? 
    runningMin : minRecur(ds, i + 1, Math.min(runningMin, ds[i])); 
} 
+0

의 값이 바뀌지는 않았지만 첫 번째 라인은 ** double [] **의 첫 번째 인덱스의 값으로 변경되어야합니다 : P – lonesome

+1

그리고 빈 배열? 기본값은이 값을 클리너로 만듭니다. 어떤 경우 든 빈 배열로 호출하지 않으면 제안 된 변경으로 인해 동작에 차이가 발생하지 않습니다. –

+0

하지만 나는 내 자신의 prog에 복사/붙여 넣기를했는데, 내가 변경하지 않았다면 ... 내 자신의 질문이 어떻게 수정 될 것인가?각 반복에서 인덱스 값을 변경하는 방법을 알고 싶다면 :) – lonesome

2

편집 할 수 있습니다. 그래서이 재귀 적 메소드 호출은 전혀 멈추지 않을 것입니다.

0

각 루틴의 색인에 0 또는 1 또는 2 값이 있습니다.

+1

오, 그래, 맞아, 인덱스 – lonesome

2

당신은 실제로 인덱스 변수를 변경하지 않으므로 재귀는 끝이 없을 것입니다. 그러나 이것에는 훨씬 더 잘못된 것이 있습니다.

재귀를 사용하지 않고 배열의 최소 값을 찾을 쉬운 일반적인 방법은 :

int min = Integer.MAX_VALUE; 
for(int i = 0; i < array.length; i++) { 
    // Math.min returns the lower value of the two arguments given 
    min = Math.min(min, array[i]); 
} 
return min; 

이 쉽게 요구에 맞게 적용 할 수 있습니다.

+1

나는 당신이 배열을 의미한다고 생각합니다. 여기 길이는 배열이 아닙니다. 길이() –

+0

아 아, 변경했습니다. 또한 좀 더 자바 친화적 인 만들었습니다. – RadicalRaid

2

index 변수의 값을 절대로 조작하지 마십시오. 사람들이 사용하는 정적 변수의 수를 제한해야하는 또 다른 이유가 있습니다. 내가 당신을 도우려고하자

public class TestThe { 
    private static double[] absOfSub = new double[5]; 
    private static void compare(int currentIdx, int minIdx) { 
     if(currentIdx < absOfSub.length) { 
     if(absOfSub[currentIdx] < absOfSub[minIdx]) { 
      return compare(currentIdx + 1, currentIdx); 
     } else { 
      return compare(currentIdx + 1, minIdx); 
     } 
     } else { 
     return minIdx; 
     } 
    } 

    public static void main(String[] args) { 
     absOfSub[0] = 10; 
     absOfSub[1] = 810; 
     absOfSub[2] = 108; 
     absOfSub[3] = 130; 
     absOfSub[4] = 110; 
     System.out.println("The minimum value is: " + absOfSub[compare(0, 0)]); 
    } 
} 

편집 좀 더 참고 :

  • 항상이 의도 경우, 비공개로 속성 접근을 지정
  • 항상 포맷 코드
  • 재귀를 작성할 때 모든 후속 호출에 대해 항상 무언가를 변경하고 종료 조건에 더 가까워 지도록하십시오.
  • double 프리미티브 유형 자체는 비교 연산자를 정의하므로 Double.compare을 사용할 필요가 없습니다.
+0

+1 더 많은 참고 사항 : 예. 코드 및 변수의 대부분은 클래스에만 해당되므로 액세스 지정자는 비공개로 언급하는 것이 좋습니다. 외계인이 아니야. –

+0

당신은 그다지 의미하지 않는다 ** (0,1) **을 비교한다? – lonesome

+0

'compare (1, 0)'을 사용하여 (한 번 더 첫 번째 요소를 고려하지 않고) 호출하면 하나의 반복을 저장할 수 있지만 제안 된 방식으로도 작동합니다. –