递归生成子集的问题

时间:2019-03-08 04:58:58

标签: java algorithm subset

因此,该算法通过使用参数i引用A [i]来生成集合A的子集,在每个步骤中,有两个调用,一个包含A [i],另一个不包含A [i]。 当i == n时搜索停止。

所以,这很有意义,但我不明白这里的最后一条语句是什么。

void search(int i, ArrayList<Integer> subset,ArrayList<Integer> A, int n){
        if (i==n) System.out.println(subset);
        else{
            search(i+1,subset,A,n);
            subset.add(A.get(i));
            search(i+1,subset,A,n);
            subset.remove(subset.size()-1); /*Why do we need to do this? I am not making any function call after this*/
        }
}

我尝试排除最后一条语句,但随后它在子集中重复了元素。最后一条语句的用途是什么?

1 个答案:

答案 0 :(得分:2)

您拥有在所有递归级别共享的subset的唯一实例。

因此,在使用项目后,您应该以{{1​​}}的相同状态返回较低的级别。

想象一下呼叫树

subset

创建子集[2](代码点[] [] [2] * [1] [1] [1 2] )后,您将返回到第一级,并且必须生成子集[1]。但是*对象已经包含项目2,因此如果不删除subset中的项目2,则不可能生成[1]。


如果实现创建新的参数副本,则无需恢复状态。