确定递归java程序的基本情况

确定递归java程序的基本情况,java,recursion,Java,Recursion,此代码生成一组数字的幂集。例如,如果我们有(0,1,2),幂集是{(0,1,2),(0,2),(1,2),(0,1),(2),(1),(0),()}的 公共静态列表生成器功率集(列表输入集){ List powerSet=new ArrayList(); directedPowerSet(inputSet,0,新ArrayList(),powerSet); 返回动力装置; } public static void directedPowerSet(列表输入集、要选择的整数、当前选择的列表、列表电

此代码生成一组数字的幂集。例如,如果我们有(0,1,2),幂集是{(0,1,2),(0,2),(1,2),(0,1),(2),(1),(0),()}的

公共静态列表生成器功率集(列表输入集){
List powerSet=new ArrayList();
directedPowerSet(inputSet,0,新ArrayList(),powerSet);
返回动力装置;
}
public static void directedPowerSet(列表输入集、要选择的整数、当前选择的列表、列表电源集){
if(toBeSelected==inputSet.size()){
powerSet.add(新阵列列表(selectedSoFar));
返回;
}
//生成包含inputSet[toBeSelected]的所有子集。
selectedSoFar.add(inputSet.get(toBeSelected));
定向功率集(输入集,待选择+1,已选择,功率集);
//生成不包含inputSet[toBeSelected]的所有子集。
selectedSoFar.remove(selectedSoFar.size()-1);
定向功率集(输入集,待选择+1,已选择,功率集);
}

为什么toBeSelected==inputSet.size()时的基本情况是

因为代码试图构建n元素集的幂集,从0元素空集开始,然后移动到1元素集,然后移动到2元素集,依此类推


什么时候结束?当您最终尝试构建n个元素集时,因为只有一个元素集,而这就是输入集本身。

递归代码从零开始逐个通过有效索引进入
inputSet
列表。当前调用使用
toBeSelected
作为
inputSet
的索引,并将
toBeSelected+1
传递给下一级调用

因此,基本情况的含义是,当
toBeSelected
变得无效时,不需要选择任何其他内容

要选择的
的最后一个有效值是
inputSet.size()-1
toBeSelected==inputSet.size()
检测
toBeSelected
的第一个无效值,作为递归的基本情况。

您可以使用
Set
以确保避免重复,并且不必删除您认为已经存在的元素
public static List<List<Integer>> generatePowerSet(List<Integer> inputSet){
    List<List<Integer>> powerSet = new ArrayList<>();
    directedPowerSet(inputSet,0,new ArrayList<Integer>(), powerSet);
    return powerSet;
}
public static void directedPowerSet(List<Integer> inputSet, int toBeSelected, List<Integer> selectedSoFar,List<List<Integer>> powerSet){
    if(toBeSelected == inputSet.size()){
        powerSet.add(new ArrayList<Integer>(selectedSoFar));
        return;
    }
    //Generate all subsets that contain inputSet[toBeSelected].
    selectedSoFar.add(inputSet.get(toBeSelected));
    directedPowerSet(inputSet,toBeSelected+1,selectedSoFar,powerSet);
    //Generate all subsets that do not contain inputSet[toBeSelected].
    selectedSoFar.remove(selectedSoFar.size()-1);
    directedPowerSet(inputSet,toBeSelected+1,selectedSoFar,powerSet);
}