2014-09-05 3 views
0

재귀 이해에 대한 안내가 필요합니다. 여기배열 방법을 찾고

내가 무엇을 가지고 : 당신이 볼 수 있듯이

public class ArrayMember 
{ 
    public static void main(String[] args) 
    { 
     int index = 0; 
     int [] arr = {1, 5, 6, 2}; 

     System.out.println(member(arr, index)); 
    } 

    public static String member(int [] arr, int index) 
    { 
     if(index == arr.length) 
      return str; 

     str = index + "\t" + str + "\n"; 

     return str + member(arr, index+1); 
    } 
} 

,이 모든 방법 (20)까지 항상 인쇄 "아니오"를 이동하지 않습니다. 그리고 for 루프를 사용하여 목표를 달성하는 것이 확실하지만 다른 방법을 생각할 수 없습니다. 어떤 도움을 주시면 감사하겠습니다.

+2

하나의 문제가 아니 당신이 i' '위치에있는 요소를 찾을 경우에도, 당신은'와'str'을 덮어 쓸 것입니다 'i + 1 '위치에 다른 요소가있을 때. 값을 찾으면 루프에서'중단 '시키거나'str'을 디폴트로'No'로 초기화하고 루프에서'Yes'로만 설정하고'No'로 되돌리지 않습니다. –

+0

@tobias_k 어떻게 str을 덮어 쓰는 지 설명 할 수 있습니까? str + str + ... 등으로 진행하면 안 되는가? 해당 반복 동안 할당 된 String을 보유하는 각 str. 기본적으로 str을 "No"로 설정하면 btw가 도움이됩니다. – cress

답변

3

코드에 두 가지 문제가 있습니다 : 다른 요소가있을 때

  1. 당신이 위치 i에서 요소를 찾을 경우에도 루프의 각 반복에 str을 설정하면, 당신은 "No"str 덮어 위치 i+1, 효과적으로 요소가 배열의 마지막 요소인지 여부를 str으로 설정하십시오. 값을 찾으면 루프에서 break으로 시도하거나 기본적으로 str에서 "No"으로 초기화하고 찾을 경우 "Yes"으로 설정하십시오.
  2. index == arr.length을 선택하면 1에서 20까지의 모든 숫자를 테스트하지 않고 index > arr[arr.length-1]을 확인 (즉, 목록의 마지막 요소보다 큰지 확인) 할 수 있지만 목록이 정렬 된 경우에만 작동합니다.

코드를 수정해야합니다. 그러나 솔직히 말해서 과제를 약간 잘못 이해했다고 생각합니다 (시작하는 것이 명확하지는 않다는 것을 인정해야하지만). 재귀를 사용하여 후속 숫자를 테스트하는 대신 (멈출 때를 알지 못하는 문제로) 배열의 다른 위치를 테스트하기 위해 루프를 사용하는 대신 루프를 사용하여 다른 숫자를 테스트합니다 당신은 테스트하고 배열의 다른 위치에 대해 재귀를 사용하려고합니다.

이 방법, 당신은이 (의사 코드)에 프로그램을 단순화 할 수 있습니다 :

function member(arr, num, index) -> bool : 
    if index does not exceed array 
     return arr[index] equals num or member(arr, num, index+1) 
    else 
     return false 

arr = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20} 
for i from 1 to 20 
    print i, member(arr, i, 0) 
+0

정말 고마워요. 작동하도록했습니다! 이것은 대단히 도움이되었습니다. 지금 재귀가 훨씬 잘 이해된다고 말할 수 있다고 생각합니다. – cress

관련 문제