算法目的就是求一个集合的幂集,比如:集合A={a,b,c},则A的幂集p(A)={a,b,c,ab,ac,bc,abc,空}
从网上找到了这个算法,可我看了一晚上也没看懂后面递归是什么意思,不知道求幂集的算法思想,谁能帮小弟看一看,给我讲一下算法思想,谢谢import java.util.*;public class  Collection { public static void main(String[] args) {
Vector collection = new Vector(); collection.add("a");
collection.add("b");
collection.add("c");

Object[] o = function (collection); for (int i = 0 ; i < o.length ; i++ ){
List a = (List)o[i];
if(a.size() > 0) {
System.out.println(a);
}
}
} public static Object[] function(Vector collection) {

ArrayList pCollection = new ArrayList();
ArrayList collectionTemp = new ArrayList();

function1 (1, collection, collectionTemp, pCollection); Object[] o = pCollection.toArray(); return o; }
   
public static void function1(int i, Vector collection, ArrayList collectionTemp, ArrayList pCollection) {

if (i > collection.size()){
pCollection.add(collectionTemp.clone());
} else { Object o = collection.elementAt(i-1);   
collectionTemp.add(o);   
function1(i+1,collection,collectionTemp,pCollection);   //就这3条递归语句看不明白,我觉得关键是没有理解该算法的思想
collectionTemp.remove(collectionTemp.size()-1);   
function1(i+1,collection,collectionTemp,pCollection);
}
}
}

解决方案 »

  1.   

    求幂积最简单的算法思想就是从最后一个元素倒着来遍历所有元素,比如说最后一个就是自己 "c" ;
    倒数第二个:首先把自己和幂积里面已有的所有元素做乘积("bc"),然后加到幂积里,此时为{c,bc};最后再加上自己"b",{b,c,bc}
    倒数第三个:把自己(a)和幂积中所有元素做乘积{ab,ac,abc},加到幂积集合中,此时幂积中为:{b,c,bc,ab,ac,abc};最后再加上自己本身"a",为:{a,b,c,bc,ab,ac,abc}.
    依次类推即可,多少元素都能计算其幂积,至于具体编程就不说了,有这个思想,编程应该是比较简单了,就留给楼主了。 
      

  2.   

    无非就是一个递归嘛  看下面这个函数我们可以知道最终的结果是存在了一个Object数组中 
    public static Object[] function(Vector collection) { ArrayList pCollection = new ArrayList(); 
    ArrayList collectionTemp = new ArrayList(); function1 (1, collection, collectionTemp, pCollection); Object[] o = pCollection.toArray(); //Object数组的值来自于ArrayList pCollection,也就是说collectionTemp是过渡的  return o; } 下面具体看看这个function1的作用
    function1 (1, collection, collectionTemp, pCollection); 
    第一次运行 1 < collection.size() 所以不会运行 那么会运行Object o = collection.elementAt(i-1); 这样的话collection里面有a,b,c取出第0个 也就第一个了  那就是o = a对吧?然后把a加到collectionTemp中去,这时候运行function1(i+1,collection,collectionTemp,pCollection); 其实i=1的也就是function1(2,collection,collectionTemp,pCollection); 这时候2还是<3的  所以接着取collection中的第一个元素 也就是b 再把b加到collectionTemp,这时候运行function1(3,collection,collectionTemp,pCollection); 3仍然不大于3,所以还是取第二个元素 也就是c  然后c到collectionTemp中去  这是后就要运行function1(4,collection,collectionTemp,pCollection); 4>3  所以执行if中的拷贝:把collectionTemp中的3个元素直接拿到pCollection中   可以了吧  写累死了...给分鼓励下吧  哈哈  你实在不会  可以用Eclipse的debug一步一步看
      

  3.   

    如果一个集合有3个元素({a,b,c}),我们就用一个3位的二进制数来处理
    000
    001
    ...
    111
    正好对应8个子集,(000表示空集).让a对应左数第一位,b对应第二位,c ....
    这样循环,让i从0到8,依次扫描i中的各个位,如果第一位是1,则把a放到这个集合里.....
      

  4.   

    呵呵,一开始我也看不明白,在本地运行了一下,结果是:
    [a, b, c]
    [a, b]
    [a, c]
    [a]
    [b, c]
    [b]
    [c]
    理解递归并不难,我觉得比较难想到的是处理后面的逻辑
    collectionTemp.remove(collectionTemp.size()-1);
    function1(i+1,collection,collectionTemp,pCollection);删除集合的最后一个元素再调用递归, 这个才是这个算法的关键.
      

  5.   

    能在给我解释一下后面的逻辑吗?就这个函数看了一天了还是看不懂,尤其是后面的
    function1(i+1,collection,collectionTemp,pCollection); 
    collectionTemp.remove(collectionTemp.size()-1);  
    function1(i+1,collection,collectionTemp,pCollection); 
    怎么递归了两次呢?第一次递归是什么意思?第二次又是什么意思呢?小弟愚笨,请大哥再给我好好解释解释,不胜感激!public static void function1(int i, Vector collection, ArrayList collectionTemp, ArrayList pCollection) { if (i > collection.size()){ 
    pCollection.add(collectionTemp.clone()); 
    } else { Object o = collection.elementAt(i-1);  
    collectionTemp.add(o);  
    function1(i+1,collection,collectionTemp,pCollection); 
    collectionTemp.remove(collectionTemp.size()-1);  
    function1(i+1,collection,collectionTemp,pCollection); 



      

  6.   


    能在给我解释一下后面的逻辑吗?就这个函数看了一天了还是看不懂,尤其是后面的 
    function1(i+1,collection,collectionTemp,pCollection); 
    collectionTemp.remove(collectionTemp.size()-1);  
    function1(i+1,collection,collectionTemp,pCollection); 
    怎么递归了两次呢?第一次递归是什么意思?第二次又是什么意思呢?小弟愚笨,请大哥再给我好好解释解释,不胜感激! public static void function1(int i, Vector collection, ArrayList collectionTemp, ArrayList pCollection) { if (i > collection.size()){ 
    pCollection.add(collectionTemp.clone()); 
    } else { Object o = collection.elementAt(i-1);  
    collectionTemp.add(o);  
    function1(i+1,collection,collectionTemp,pCollection); 
    collectionTemp.remove(collectionTemp.size()-1);  
    function1(i+1,collection,collectionTemp,pCollection);