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

时间:2017-08-12 17:53:17

标签: java recursion

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

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);
}

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

因此,基本情况的含义是没有其他选择,当toBeSelected变为无效时会发生这种情况。

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