Java 使用递归迭代ArrayList

Java 使用递归迭代ArrayList,java,list,recursion,Java,List,Recursion,我编写了一个方法,基本上检查两个ArrayList中的所有元素是否相等,如果相等,则返回true。我相信这个方法是可行的,但是,我也希望只使用递归编写这个方法,而不使用任何循环,这意味着我必须替换for循环块。有什么建议或提示吗 public static boolean isEqual(ArrayList<O> arrlist1, ArrayList<O> arrlist2) { ArrayList<O> um=new ArrayList&l

我编写了一个方法,基本上检查两个ArrayList中的所有元素是否相等,如果相等,则返回true。我相信这个方法是可行的,但是,我也希望只使用递归编写这个方法,而不使用任何循环,这意味着我必须替换for循环块。有什么建议或提示吗

public static boolean isEqual(ArrayList<O> arrlist1, ArrayList<O> arrlist2) {
        ArrayList<O> um=new ArrayList<O>();
        ArrayList<O> um2=new ArrayList<O>();
        um=arrlist1;
        um2=arrlist2;
        boolean comp=false;
        if (um.size()==um2.size()){
            for (int i=0; i<um.size(); i++){
                if (um.get(i)==(um2.get(i)))
                    comp=true;
                else
                    comp=false;
            }
        }
        return comp;    
    }
publicstaticbooleaniesequal(arraylistarrlist1,arraylistarrlist2){
ArrayList um=新的ArrayList();
ArrayList um2=新的ArrayList();
um=arrlist1;
um2=arrlist2;
布尔值comp=false;
如果(um.size()==um2.size()){

对于(inti=0;iJava提供了一个方法,我建议您使用它()。此外,您的方法签名应该更像这样(注意布尔前面的

递归版本:

public static boolean isEqual(ArrayList<O> arrlist1, ArrayList<O> arrlist2, int n) {
    if (arrlist1.size() == n && arrlist1.size() == arrlist2.size()) {
        return true;
    } else {
           if (arrlist1.get(n).equals(arrlist2.get(n))) {
               return isEqual(arrlist1, arrlist2, n + 1);
           }
           else {
               return false;
           }
    }
}

我假设您希望以递归方式执行此操作以达到学习目的(出于任何其他原因,执行此操作都毫无意义;最好使用现有的库例程,其次最好像您已经做的那样使用
for
循环)

使用递归的一般方法是,通过在问题中找到同一问题的一个或多个较小版本来解决问题。因此,为了比较数组是否相等,如果数组的长度为N,则可以通过

  • 比较第一个元素,然后(较小的问题)递归比较两个数组的第二个到最后一个元素,这将是长度为N-1的数组;或者

  • 比较最后的元素,然后(较小的问题)递归地比较每个数组的前N-1个元素的子数组;或者

  • 如果您真的想要良好的实践,请将每个数组一分为二(两个较小的问题),然后比较左半部是否相等,右半部是否相等

要获得较小的数组,您可能不希望通过复制元素来创建新数组——速度太慢。相反,您可以编写一个只将子数组的第一个和最后一个索引作为参数的方法,然后您的递归方法将假定这些边界之间的较大数组部分是它处理的较小的子数组(或者,如果第一个索引每次都相同,或者最后一个索引每次都相同,则只需传递一个参数;@alfasin的解决方案就是这样做的。它假设它所使用的子数组具有边界
n
arrlist1.size()-1

您还需要确定何时停止。对于前两种方法,您可以在子阵列的长度为0时停止。(或者,当子阵列的长度为1时,您可以比较单个元素,而不是递归调用该方法。这是您的选择。)对于第三种方法,当你将子数组一分为二时,你必须停止使用长度为1的子数组——否则,如果你试图将它一分为二,你将有一个长度为0的数组和一个长度为1的数组——最后一个问题并不是很小


无论如何,这是一个相当长的答案,当然比比较两个数组的相等性要多得多。但我试图给你一个基本想法,告诉你如何处理其他确实需要递归的问题。

你为什么要这样做?我看不出有任何必要将这种迭代写入递归。这个逻辑是错误的g、 只有当第一个列表的最后一个元素和第二个列表的最后一个元素相等时,它才会返回
true
。小建议:不要使用大写字母
O
作为标识符。看起来太像零了。(来自+1的建议是指向Java库现有功能以及一个好的解决方案。您测试引用等式并且
arrlist1.get(n)==arrlist1.get(n)
总是正确的。@ElliottFrisch感谢您的好提示:它应该是
arrlist1.get(n)==arrlist2.get(n)
。已修复。您仍在使用参考(
=
)而不是
equals(Object)
)进行测试,这可能会导致一些难以发现的错误。咖啡因戒断的典型迹象。我建议您喝咖啡。另外,+1现在看起来不错。@ElliottFrisch您不知道自己有多正确……我最好从decaff切换回来……:))
public static <T> boolean isEqual(List<T> arrlist1, List<T> arrlist2) {
    if (arrlist1.size() == arrlist2.size()) {
        if (arrlist1.get(0).equals(arrlist2.get(0))) {
            if (arrlist1.size() == 1) {
                return true;
            }
            return isEqual(arrlist1.subList(1, arrlist1.size()),
                    arrlist2.subList(1, arrlist2.size()));
        }
    }
    return false;
}
public static boolean isEqual(ArrayList<O> arrlist1, ArrayList<O> arrlist2, int n) {
    if (arrlist1.size() == n && arrlist1.size() == arrlist2.size()) {
        return true;
    } else {
           if (arrlist1.get(n).equals(arrlist2.get(n))) {
               return isEqual(arrlist1, arrlist2, n + 1);
           }
           else {
               return false;
           }
    }
}
 isEqual(arrlist1, arrlist2, 0);