2013-07-22 3 views
5

사용자 지정 연결 목록에 대해 contains 메서드를 작성하라는 요청을 받았습니다. 저는 재귀 적 메소드가 기본 케이스와 재귀 케이스를 가져야한다는 것을 알고 있습니다. 그러나 메소드의 재귀 적 케이스를 작성하는 방법을 이해하는 데 어려움을 겪고 있습니다. 지금까지 내가 작성한 내용이지만 내 코드는 기본 사례를 두 번 이상 실행합니다. 지도 좀 해줄 수있어?숙제에 대한 자바의 재귀 메서드 사용

public class OrderedList { 

private Node first; 

//Constructor 
public OrderedList() { 
    this.first = null; 
} 

//Return the number of items in the list 
public int size() { 
    int counter = 0; 
    Node pointer = this.first; 
    while (pointer != null) { 
     counter++; 
     pointer = pointer.next; 
    } 
    return counter; 
} 

//Return an array of copies of the stored elements 
public Comparable[] getStore() { 

    Comparable[] elements = new Comparable[size()]; 
    Node pointer = this.first; 
    if (this.first == null) { 
     return elements; 
    } else { 
     int i = 0; 
     while (pointer != null) { 
      elements[i] = pointer.data; 
      pointer = pointer.next; 
      i++; 
     } 
     return elements; 
    } 

} 
//true iff item matches a stored element 
//Recursive 

public boolean contains(Comparable item) { 

    //Base case 
    if (this.first == null) { 

     return false; 
    } 
    Node pointer = this.first; 
    this.first = this.first.next; 

    if (pointer.data.compareTo(item) == 0) { 

     return true; 

    } 
    //Recursive case 

    else { 

     boolean info = contains(item); 
     pointer.next = this.first; 
     this.first = pointer; 

     return info; 
    } 
} 
+0

왜 메소드에서 클래스 변수를 변경하고 있습니까? 'this.first'가 아니라'Node'에 전달 된 것을 사용해야합니다. 해당 메소드를 호출 할 때마다 목록의 맨 위가 변경됩니다. 당신은 당신의 명부를 파괴하고 있습니다! – thatidiotguy

답변

3

나는 이런 식으로 뭔가를 좋아 첫째 :

public boolean contains(Comparable item) 
{ 
    return containsHelper(this.first, Comparable item); 
} 

private boolean containsHelper(Node node, Comparable item) 
{ 
    //base case 
    if(node == null) 
    { 
     return false; 
    } 
    else 
    { 
     if(node.data.compareTo(item) == 0) 
     { 
      return true; 
     } 

     return containsHelper(node.next, item); 
    } 


} 

이 사용자로부터 구현 세부 사항을 숨기고 당신이 그 방법을 실행하면 무시당하는 목록을 중지합니다.

+0

헬퍼 메서드를 구현하지 않아도 메서드가 목록을 재정의하지 못하게 할 방법이 있습니까? – jorgeAChacon

+1

@ user1166061 사실이게 표준 방식입니다. 그렇지 않으면 캡슐화를 망치는 첫 번째 노드를 전달하기 위해 코드 사용자에게 의존해야합니다. 내가 가지고있는 코드의 양이 줄어들어 왜 도우미를 피하기를 원하는지 확신 할 수 없다는 것을 알 수 있습니다! – thatidiotguy

+0

고맙습니다. – jorgeAChacon

0

재귀 적 솔루션을 구현하려면 contains에 대한 보조 방법이 필요합니다. 보조 메서드에는 테스트를 시작할 Node이라는 추가 인수가 있어야합니다. public contains 메서드는 보조 메서드를 호출하고 this.first을 시작 노드로 전달해야합니다. 논리의 나머지 부분은 당신이 알아내는 것이 아주 간단해야합니다.

+0

이 방법으로 만 목록을 보존 할 수있는 방법이 있습니까? – jorgeAChacon

+0

@ user1166061 - 아무 것도 수정하지 않도록 보조 메소드를 작성할 수 있습니다. 나는 당신이 보조 메소드없이 재귀'contains' 메소드를 작성할 수 있다고 생각하지 않는다. –

+0

@TedHopp 나는 클라이언트가'list.contains (list.getFirst(), item)'같은 코드를 사용하는 것을 요구할 유일한 방법이 있다고 생각한다. imo – thatidiotguy

0

내가 본 바로는 else statemnet이 한 번 실행되면 코드가 true를 반환합니다. 재귀가 while 루프와 매우 비슷하게 동작하고 값이 업데이트되지 않으면 기본 사례가 반복해서 실행되기 때문에 매번 부울 값을 false로 설정해야한다고 생각합니다.