很难识别递归调用后编译器将采取的下一步操作



我很难理解这段代码。


class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> subsets = new ArrayList<>();
generateSubsets(0, nums, new ArrayList<Integer>(), subsets);
return subsets;
}
public void generateSubsets(int index, int[] nums, List<Integer> current, List<List<Integer>> subsets){
subsets.add(new ArrayList<>(current));
for(int i = index; i < nums.length; i++){
current.add(nums[i]);           
generateSubsets(i + 1, nums, current, subsets);
current.remove(current.size()-1);

}
}
}

我不明白这段代码将如何在每一步运行这段代码。如果我们举一个输入[1,2,3]的例子。我想首先我会得到当前列表[1],然后是递归调用,新的当前列表是[1,2],然后是新的递归调用,当前列表是[1,2,3],但我很困惑接下来的步骤是什么。

如果有人能带我走过这个过程,我将不胜感激。尤其是当代码CCD_ 1被命中时。

非常感谢。

在感兴趣的行设置断点,并使用IDE进行调试。作为初学者,您还可以放置一些println语句来遵循递归代码流:

public static void generateSubsets(int index, int[] nums, List<Integer> current, List<List<Integer>> subsets){
System.out.println("nrecursive method called with index: " + index + " current list: " + current);
subsets.add(new ArrayList<>(current));
System.out.println("subsets after adding current: " + subsets);
for(int i = index; i < nums.length; i++){
System.out.println("entering loop at index: " + index);
current.add(nums[i]);
System.out.println("current after adding current index: " + current);
generateSubsets(i + 1, nums, current, subsets);
current.remove(current.size()-1);
System.out.println("current after removing last element back at index: "+ index + " " +current);
}
}

最新更新