递归实现方法

时间:2016-06-11 10:21:24

标签: java recursion

我是Java的新手,仍然试图绕过递归。下面的函数在两个排序列表列表x和列表y的第一个交集处返回true。

public static boolean checkIntersection(List<Integer> x, List<Integer> y) {
    int i = 0;
    int j = 0;
    while (i < x.size() && j < y.size()) {
        if (x.get(i).equals(y.get(j))) {
            return true;
        } else if (x.get(i) < y.get(j)) {
            i++;
        } else {
            j++;
        }
    }
    return false;
}

现在我一直试图用递归来实现它,我知道应该有一个基本情况,在这种情况下是一个空列表,然后尝试通过一次排除一个元素来减少列表并将其反馈给相同的递归函数,但是我无法一遍又一遍地通过列表的其余部分来检查交集。

public static boolean recursiveChecking(List<Integer> x,List<Integer> y) {
    if(x.size() == 0){
        return false;
    }
    else {
        return recursiveChecking(x.subList(1, x.size()-1), y);
    }
}

任何帮助都将受到高度赞赏。谢谢。

2 个答案:

答案 0 :(得分:5)

使递归的一般方法是想到两件事:

  • 我什么时候能够轻松地生成答案? - 这个问题的答案让您可以编写基本案例代码。在您的情况下,当两个列表中至少有一个为空(结果为false)或两个非空列表的初始元素相同时,您可以轻松地生成答案(结果为{{ 1}})
  • 如果答案非常重要,如何减少问题? - 对此问题的回答可让您决定如何进行递归调用。在您的情况下,您可以在进行递归调用 * 之前删除其中一个列表的初始元素,或者通过true代替ListIterator<Integer>表示非{ - 破坏性解决方案。

* 当然,在这种情况下,你需要注意在通话后添加你的号码,或者在开始递归链之前复制两个列表。

答案 1 :(得分:4)

当列表被排序时,您的递归应该删除具有较小第一个值的列表的第一个元素。然后,如果两个列表都以相同的数字开头,则必须返回true;如果任何列表为空,则返回false。否则你继续删除元素。这看起来像这样(这段代码未经测试):

List<Integer>