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传递列表的位置。但是,当您递归到duplicateHelper传递的子列表时,不再包含tat index0而是包含先前比较的元素。

考虑从duplicateto传递子列表duplicateHelper并将比较检查移动到非空 else。添加日志语句以找出代码出错的地方。

于 2012-10-24T16:57:38.437 回答