2016-06-09 3 views
0

나는 재귀에 대해 공부하고 있습니다. 나는 기본을 알고 그것의 작동 방식을 이해하지만, ive는 걸림돌을 만났다. 이것은 완벽하게 작동재귀를 사용하여 최소값의 위치를 ​​찾으십시오.

public static int findMinPosition(int[] list, int position) 
{ 
    int minPosition = 0; 
    if(position == list.length) 
    { 

    } 

    else if(position != list.length) 
    { 
    minPosition = findMinPosition(list, position+1); 
    if(list[position] < list[minPosition]) 
    { 

     return minPosition = position; 
    } 

    } 
    return minPosition; 
} 

하지만 방법을 잘 메신저 : I는 재귀를 사용하여 배열의 최소 값의 위치를 ​​찾기 위해 코드를 썼다. 나는 minPosition = findMinPosition(list, position+1);을 제외한 모든 것을 이해합니다. 나는 이것이 메소드에서 반환 된 값을 주어야한다고 생각했기 때문에 원래는 메소드도 호출했다. 재귀의 포인트이기도하다. 하지만 그것은 내가 필요한 코드 줄입니다 ... 그래서 minPosition = findMinPosition(list, position+1); 메서드를 호출합니까? 거친 설명과 도움을 드려 죄송

+0

당신이 가진 것은 혼란스러운 방식으로 작성되었습니다. 지역 변수를 사용하지 마십시오. 매개 변수 호출을 통해 모든 상태를 전달하십시오. 가장 좋은 조언은 리틀 스키머 (Little Schemer)의 사본을 받아서 읽는 것입니다. –

답변

0

예, 그 선이 메소드를 호출 유용합니다. 말로 표현하자면, "이 목록의 나머지에서 최소한의 위치를주세요." 다음 줄에서는 첫 번째 값을 해당 최소값과 비교하고 작은 항목의 인덱스를 호출자에게 다시 전달합니다.

당신은 구조 팽창을 제거하여이 조금을 단축 할 수 있습니다

public static int findMinPosition(int[] list, int position) 
    { 
    if (position == list.length) 
     return 0 

    else 
    { 
     int minPosition = findMinPosition(list, position+1); 
     return list[position] < list[minPosition] ? position : minPosition 
    } 

당신은 각 재귀보다는 원래 목록과 인덱스에 남아있는 목록을 전달하여 더욱이 문제를 줄일 수있다. 나는 그것을 학생을위한 운동으로 남겨 둘 것입니다.

+0

아, 정말 감사합니다. 그래서 기본적으로 변수의 값을 얻기 위해 변수를 사용하면 변수에 값을 주지만 메서드의 또 다른 반복을 작성하게됩니까? –

+0

다른 반복 작성은 호출 (함수 호출)에 따라 다릅니다. 변수에 할당되었는지 여부는 독립적 인 연산입니다. – Prune

관련 문제