2013-07-22 12 views
5

私はカスタムリンクリストのためのcontainsメソッドを書くように求められました。 私は、再帰的メソッドは、基底の場合、再帰的なケースを持つ必要があることを知っています。しかし、私は方法の再帰的なケースを記述する方法を理解するいくつかの問題を抱えています。これまでのところ私が書いたものですが、私のコードはベースケースを複数回実行しています。あなたは私にいくつかの指導をお願いできますか?宿題のためにJavaの再帰的メソッドを使用

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です。パブリックメソッドは、補助メソッドを呼び出し、this.firstを開始ノードとして渡す必要があります。ロジックの残りの部分は、あなたが把握するのに非常に簡単なはずです。

+0

この方法だけを使ってリストを節約できる方法はありますか? – jorgeAChacon

+0

@ user1166061 - 補助メソッドは、何も変更しないように書くことができます。私はあなたが補助メソッドなしで再帰的な 'contains'メソッドを書くことはできないと思います。 –

+0

@TedHopp私は、クライアントが 'list.contains(list.getFirst()、item)'のようなコードを使用することを要求する唯一の方法はないと思っていますimo – thatidiotguy

0

私が見ていることから、else statemnetが一度実行されると、あなたのコードはtrueを返します。あなたがする必要があるのは、反復がwhileループと非常によく似た働きをし、値が更新されないと、ベースケースが何度も何度も実行されるため、毎回ブール値をfalseに設定することだと思います。

関連する問題