Java 理解计算功率集的递归流程

Java 理解计算功率集的递归流程,java,Java,我找到了一个计算数组幂集的代码 我无法理解subseq()方法中发生了什么。 根据我的理解和调试时看到的情况- 1. first [] is added. 2. Goes inside loop , `i=0` adds `[1]` 3. recursive call , `i=1` adds `[1,2]` 4. recursive call , `i=2` adds `[1,2,3]` 当i=3时,它不应进入循环本身, 为什么在此之后,执行将删除。 你能帮我理解一下吗 public cla

我找到了一个计算数组幂集的代码

我无法理解
subseq()
方法中发生了什么。 根据我的理解和调试时看到的情况-

1. first [] is added.
2. Goes inside loop , `i=0` adds `[1]`
3. recursive call , `i=1` adds `[1,2]`
4. recursive call , `i=2` adds `[1,2,3]`
i=3
时,它不应进入循环本身, 为什么在此之后,执行将
删除
。 你能帮我理解一下吗

public class printSubSequences {

    public static void main(String[] args) {
        int[] num = {1,2,3};
        List<List<Integer>> subsets = new ArrayList<>();
        subseq(0, num, new ArrayList<Integer>(), subsets );

        System.out.println(subsets);

    }

    public static void subseq(int index, int[] num, List<Integer> current, List<List<Integer>> subsets) {

        subsets.add(new ArrayList<>(current));
        for(int i = index ; i< num.length; i++) {
            current.add(num[i]);
            subseq(i+1, num, current, subsets);
            current.remove(current.size() -1);
        }

    }

}
公共类打印子序列{
公共静态void main(字符串[]args){
int[]num={1,2,3};
列表子集=新的ArrayList();
subseq(0,num,new ArrayList(),子集);
系统输出打印项次(子集);
}
公共静态void subseq(int索引,int[]num,列表当前,列表子集){
添加(新ArrayList(当前));
for(int i=索引;i
这是一个简单的算法

当递归到达底部时:

subseq(0, {1,2,3}, [], []);
    subseq(1, {1,2,3}, [1], [[]]);
        subseq(2, {1,2,3}, [1,2], [[], [1]]);
            subseq(3, {1,2,3}, [1,2,3], [[], [1], [1,2]]); <---

此时
current=[1,2,3]
,因此最后一个元素
3
将被删除。

Java的简单基础是,它将逐个执行每一行。它将方法调用存储在线程的堆栈内存中

以你为例,

  • 首先添加[]
  • 在循环中,
    i=0
    添加
    [1]
  • 递归调用
  • 它将调用subseq()并将调用添加到线程堆栈中,但请注意current.remove(current.size()-1)仍处于挂起状态。为了便于理解,请给这个调用别名A,
    i=1
    添加
    [1,2]
    ,线程堆栈
    [A]

  • 递归调用
  • 与上面的exalian相同,它将再次调用subseq(),并将其添加到方法堆栈中。让我们给这个调用别名B,
    i=2
    添加
    [1,2,3]
    ,线程堆栈
    [B,A]

  • 跳回上一个呼叫
  • 现在,这个条件将第三次失败。因此它将跳过循环。现在,指针将返回到之前挂起的调用。因此,它将查看堆栈
    [B,A]
    并转到调用B。它将开始执行递归方法调用之后的操作,然后将其从堆栈中删除。对于我们来说,在执行删除操作后,堆栈将类似于
    [A]
    删除
    3

  • 跳回上一个呼叫
  • 操作
    A
    和删除
    2

  • 跳回原来的通话
  • 它将删除
    1


    请注意,我提到的操作别名完全是为了我们理解概念。它们实际上被命名为方法名。您可以在上了解有关递归的更多信息。

    提示:如果您不了解代码的功能。。。第一步是添加打印语句。让你的代码告诉你它在做什么!。。。或者使用调试器(但我并不是说最好使用调试器),请注意,您可能希望在这里接受答案。当你的问题解决后,花时间接受最有用的答案!
    current.remove(current.size() -1);