首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归生成子集的问题

递归生成子集的问题
EN

Stack Overflow用户
提问于 2019-03-08 12:58:58
回答 1查看 58关注 0票数 1

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

所以,这是有道理的,但我不能理解最后一条语句在这里做了什么。

代码语言:javascript
复制
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*/
        }
}

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

EN

回答 1

Stack Overflow用户

发布于 2019-03-08 13:06:45

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

因此,在使用item之后,你应该返回到较低的级别,并保持subset的状态。

想象一下调用树

代码语言:javascript
复制
[]
     []
     [2]  *

[1]  
     [1]
     [1 2]

生成子集2后,返回到第一级,必须生成子集% 1。但subset对象已包含物料% 2,因此如果不删除*中的物料%2,则无法生成%1

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55056974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档