首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无回路递归生成功率集

无回路递归生成功率集
EN

Stack Overflow用户
提问于 2013-03-19 19:30:36
回答 8查看 21.2K关注 0票数 11

如何编写一个递归方法PowerSet(String input)来打印出传递给它的字符串的所有可能组合?

例如: PowerSet("abc")将打印abc,ab,ac,bc,a,b,c

我见过一些带有循环的递归解决方案,但在这种情况下不允许使用循环。

有什么想法吗?

编辑:必选方法只有一个参数,即字符串输入。

EN

回答 8

Stack Overflow用户

发布于 2013-04-04 03:03:47

这也会起到这个作用:

代码语言:javascript
复制
var powerset = function(arr, prefix, subsets) {
  subsets = subsets || [];
  prefix = prefix || [];
  if (arr.length) {
    powerset(arr.slice(1), prefix.concat(arr[0]), subsets);
    powerset(arr.slice(1), prefix, subsets);
  } else {
    subsets.push(prefix);
  }
  return subsets;
};

powerset('abc');
票数 3
EN

Stack Overflow用户

发布于 2013-03-19 19:40:10

如果你没有循环,用递归模拟一个循环,使用迭代器,这实际上是非常简单的。

代码语言:javascript
复制
    public final Set<Set<Integer>> powerSet(Set<Integer> set) {
        Set<Set<Integer>> powerSet = new HashSet<>();
        powerSet(set, powerSet, set.iterator());
        return powerSet;
    }
    public final void powerSet(Set<Integer> set, Set<Set<Integer>> powerSet, Iterator<Integer> iterator) {
        if(iterator.hasNext()) {
            Integer exlude = iterator.next();
            Set<Integer> powThis = new HashSet<Integer>();
            powThis.addAll(set);
            powThis.remove(exlude);
            powerSet.add(powThis);
            powerSet(powThis, powerSet, powThis.iterator());
            powerSet(set, powerSet, iterator);
        }
    }
//usage
        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(4);
        log.error(powerSet(set).toString());
票数 2
EN

Stack Overflow用户

发布于 2013-03-19 20:04:56

João Silva提出的generic solution的递归版本:

代码语言:javascript
复制
public static <T> Set<Set<T>> powerSet2(Set<T> originalSet) {
    Set<Set<T>> sets = new HashSet<Set<T>>();
    if (originalSet.isEmpty()) {
        sets.add(new HashSet<T>());
        return sets;
    }
    List<T> list = new ArrayList<T>(originalSet);
    T head = list.get(0);
    Set<T> rest = new HashSet<T>(list.subList(1, list.size()));
    addSets(sets, powerSet(rest), head);
    return  sets;
}

private static <T> void addSets(Set<Set<T>> sets, Set<Set<T>> setsToAdd, T head) {
    Iterator<Set<T>> iterator = setsToAdd.iterator();
    if (iterator.hasNext()) {
        Set<T> set = iterator.next();
        iterator.remove();
        Set<T> newSet = new HashSet<T>();
        newSet.add(head);
        newSet.addAll(set);
        sets.add(newSet);
        sets.add(set);
        addSets(sets, setsToAdd, head);
    }
}

我提取了递归addSets方法来转换原始的for循环:

代码语言:javascript
复制
for (Set<T> set : powerSet(rest)) {
    Set<T> newSet = new HashSet<T>();
    newSet.add(head);
    newSet.addAll(set);
    sets.add(newSet);
    sets.add(set);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15498281

复制
相关文章

相似问题

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