Can someone explain me how this code works or if it is possible to be written in another way? I tried it with just ArrayList but cannot figure it out.public static Set<Set<Integer>> combinations(List<Integer> groupSize, int k) {    Set<Set<Integer>> allCombos = new HashSet<Set<Integer>> ();    // base cases for recursion    if (k == 0) {        // There is only one combination of size 0, the empty team.        allCombos.add(new HashSet<Integer>());        return allCombos;    }    if (k > groupSize.size()) {        // There can be no teams with size larger than the group size,        // so return allCombos without putting any teams in it.        return allCombos;    }    // Create a copy of the group with one item removed.    List<Integer> groupWithoutX = new ArrayList<Integer> (groupSize);    Integer x = groupWithoutX.remove(groupWithoutX.size()-1);    Set<Set<Integer>> combosWithoutX = combinations(groupWithoutX, k);    Set<Set<Integer>> combosWithX = combinations(groupWithoutX, k-1);    for (Set<Integer> combo : combosWithX) {        combo.add(x);    }    allCombos.addAll(combosWithoutX);    allCombos.addAll(combosWithX);    return allCombos;}
Recursive method to return a set of all combinations
java;recursion