所以,这很有意义,但我不明白这里的最后一条语句是什么。
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*/
}
}
我尝试排除最后一条语句,但随后它在子集中重复了元素。最后一条语句的用途是什么?
答案 0 :(得分:2)
您拥有在所有递归级别共享的subset
的唯一实例。
因此,在使用项目后,您应该以{{1}}的相同状态返回较低的级别。
想象一下呼叫树
subset
创建子集[2](代码点[]
[]
[2] *
[1]
[1]
[1 2]
)后,您将返回到第一级,并且必须生成子集[1]。但是*
对象已经包含项目2,因此如果不删除subset
中的项目2,则不可能生成[1]。
如果实现创建新的参数副本,则无需恢复状态。