1

リストに重複があるかどうかを確認し、再帰のみを使用して (ループなしで) true または false を返すとします。したがって、char の ArrayList が使用されている場合、[a,b,c,d,e] は false を返す必要があります。[a,a,b,c,d] または [a,b,b,c,c,d] は true を返す必要があります。私はさまざまな方法を試してテストしましたが、一部のケースでは機能しましたが、すべてではありませんでした。コードを変更したところ、これが現在のものです。(最後の if 文に問題があります) ヒントを教えてもらえますか? ありがとう。

    public static <T> boolean duplicate(List<T> list) throws NullPointerException {
        return duplicateHelper(list, list.get(0));
}

public static <T> boolean duplicateHelper(List<T> list, T t){
    if (list == null)
        throw new NullPointerException();
    if(list.isEmpty())
        return false;
    if(list.size() > 1){
        if(t.equals(list.get(1)))
            return true;        
    }
    if(list.size() == 1)
        return false;
    if(!duplicateHelper(list.subList(1,list.size()), t)){
        return  duplicate(list.subList(1,list.size()));
    }
    return false;

}
4

2 に答える 2

4

次のようなことをお勧めします。

function recurse(myList, seenList)  
{  
    currentElement =     myList.removeLastElement();
    if(seenList.contains(currentElement)    
     {
        return false;  
      }
    seenList.add(currentElement);   


    return recurse(myList,seenList);
}  

これが宿題であることは理解していますが、完全な解決策を提供することなく、できるだけ簡単にしようとしました。

于 2012-10-24T16:46:51.283 に答える
1

再帰は、前後の条件によって支援されます。開始時と終了時に常に真であること。私が見ているのは、最初に入力するduplicateHelperと、要素が渡されたリストのt位置にあるということです。ただし、渡されたサブリストに0再帰すると、インデックスに含まれなくなり、代わりに以前に比較された要素が含まれます。duplicateHelpert0

サブリストをduplicateto に渡しduplicateHelper、比較チェックを空でない else に移動することを検討してください。ログ ステートメントを追加して、コードのどこが間違っているかを把握します。

于 2012-10-24T16:57:38.437 に答える