我想要查找列表中是否有重复项,并仅使用递归返回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;
}
答案 0 :(得分:3)
我建议做这样的事情:
function recurse(myList, seenList)
{
currentElement = myList.removeLastElement();
if(seenList.contains(currentElement)
{
return false;
}
seenList.add(currentElement);
return recurse(myList,seenList);
}
虽然我意识到这是家庭作业,但我试图尽可能地直截了当而不提供完整的解决方案。
答案 1 :(得分:1)
递归由前后条件辅助。在开始和结束时始终如一的事情。我看到的是,当您第一次输入duplicateHelper
时,元素t
位于传递列表的0
位置。但是,当您递归到duplicateHelper
时,传递的子列表不再包含t
索引0
,而是包含先前已比较过的元素。
考虑将子列表从duplicate
传递到duplicateHelper
,并将比较检查移到非空的其他位置。添加日志记录语句以确定代码出错的位置。