Generating power set recursively without any loops

前端 未结 8 1253
执笔经年
执笔经年 2020-12-16 18:50

How do you write a recursive method PowerSet(String input) that prints out all possible combinations of a string that is passed to it?

For example: PowerSet(\"abc\")

8条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-16 19:10

    A recursive version of the generic solution proposed by João Silva :

    public static  Set> powerSet2(Set originalSet) {
        Set> sets = new HashSet>();
        if (originalSet.isEmpty()) {
            sets.add(new HashSet());
            return sets;
        }
        List list = new ArrayList(originalSet);
        T head = list.get(0);
        Set rest = new HashSet(list.subList(1, list.size()));
        addSets(sets, powerSet(rest), head);
        return  sets;
    }
    
    private static  void addSets(Set> sets, Set> setsToAdd, T head) {
        Iterator> iterator = setsToAdd.iterator();
        if (iterator.hasNext()) {
            Set set = iterator.next();
            iterator.remove();
            Set newSet = new HashSet();
            newSet.add(head);
            newSet.addAll(set);
            sets.add(newSet);
            sets.add(set);
            addSets(sets, setsToAdd, head);
        }
    }
    

    I extract the recursive addSets method to transform the original for loop:

    for (Set set : powerSet(rest)) {
        Set newSet = new HashSet();
        newSet.add(head);
        newSet.addAll(set);
        sets.add(newSet);
        sets.add(set);
    }
    

提交回复
热议问题