2016-08-24 2 views
0

배열 내부에서 가장 작은 숫자를 찾는 다음 프로그램을 이해하는 데 도움이 필요합니다. 재귀에서 문제를 기본으로 나눌 것을 알고 있습니다. 재귀를 끝내는 작은 경우와 결국 초기 기본 경우로 성장하는 작은 단계로 진행됩니다.재귀를 사용하여 배열의 최소값을 찾는 프로그램 이해하기

인덱스가 배열의 마지막 위치에 도달 할 때마다 기본 대소 문자가 충족된다는 것을 알고 있습니다. 필자는 다음 프로그램에서이 방법이 배열 전반에 걸쳐 계속해서 진행되도록하는 방법을 실제로 이해하지 못합니다.

첫 번째 값을 확인한 후 중지하는 대신 전체 배열의 값을 계속 확인하는 이유는 무엇입니까? 그것은 바로이 처음 반환하지 않는 이유를

public static double min(double[] elements, int index) { 

    if (index == elements.length - 1) { 
    return elements[index]; 
    } 

    double val = min(elements, index + 1); 

    if (elements[index] < val) 
    return elements[index]; 
    else 
    return val; 
} 
+1

이 두 번째 값이 첫 번째보다 작은 어떤 경우? –

+2

디버거에서 해당 코드를 실행하려고 시도 했습니까? 또는 펜과 종이를 사용합니까? – GhostCat

답변

2
if (elements[index] < val) 
    return elements[index]; 

을 요구하는지? 음, 않지만, 이미 재귀 호출을 만들어 있기 때문에 즉, 괜찮아요 - 그것은이 줄 것을 않습니다 : 그것은 도달 할 때까지

double val = min(elements, index + 1); 

그래서이 이상하고, 그 호출에 도달 수준을 내려, 이상 반복됩니다 기본 케이스 종료 조건 :

if (index == elements.length - 1) { 
    return elements[index]; 
    } 

그러면 호출 스택을 백업 할 때 실제 비교를 수행하고 최소값을 찾습니다.

의미가 있습니까?

+0

예, 그게 내 질문 이었지만, 그때 안으로 if (A [c]

+0

그 시점에서'val'은 "이 배열 다음에있는 모든 요소의 최소값"입니다. (위와 같이 할당 된 부분을 볼 수 있습니다.) 따라서 논리는 "배열의 모든 요소의 최소값은이 배열의 모든 요소 중 최소값이며, 그리고 이것." –

-2

훨씬 간단 그것을 이해할 수 있도록 할 자바 코드의 조각을 사용하여 :

public static double min(double[] elements, int index) { 

    if (index == elements.length - 1) { 
    System.out.println(elements[index] + " returned from recursion"); 
    return elements[index]; 
    } 

    double val = min(elements, index + 1); 

    if (elements[index] < val) { 
    System.out.println(elements[index] + " is less than " + val); 
    System.out.println(elements[index] + " returned from recursion"); 
    return elements[index]; 
    } 
    else { 
    System.out.println(val + " is less than " + elements[index]); 
    System.out.println(val + " returned from recursion"); 
    return val; 
    } 
} 

호출 "첫 번째 값을 확인 후 중지"min(array_from_which_to_find_min, 0);

관련 문제