You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求解释子集和问题递归Java代码的最后递归逻辑

通俗易懂解释子集和问题递归Java代码的核心逻辑

嘿,我来给你掰扯明白这段递归代码最后几行的逻辑——其实这就是子集和问题里选与不选的经典递归思路,咱们先把你没写完的完整代码补出来,再一步步拆解:

public static void find(int[] A, int currSum, int index, int sum, int[] solution) {
    if (currSum == sum) {
        System.out.println("\nSum found");
        for (int i = 0; i < solution.length; i++) {
            if (solution[i] == 1) {
                System.out.print(" " + A[i]);
            }
        }
    } else if (index == A.length) {
        return;
    } else {
        // 选择当前元素的分支
        solution[index] = 1;// 标记选择当前元素
        currSum += A[index];
        find(A, currSum, index + 1, sum, solution);
        
        // 回溯:取消选择当前元素,恢复状态
        currSum -= A[index];
        solution[index] = 0;// 标记不选当前元素
        find(A, currSum, index + 1, sum, solution);
    }
}

核心逻辑拆解

咱们聚焦代码的else块(也就是你提到的最后几行),它分成了三个关键步骤:

  • 选择当前元素,递归深入
    solution[index] = 1是给当前位置打个标记:「我选中了数组第index个元素」。接着currSum += A[index]把这个元素的值加到当前累加和里,然后调用find(..., index + 1, ...)——意思是:我选了这个元素,接下来去处理下一个元素,看看能不能凑出目标和。

  • 回溯,恢复状态
    当上面的递归分支跑完(不管有没有找到目标和),程序会回到这里。先执行currSum -= A[index]把刚才加的元素值减回去,再把solution[index] = 0改成未选中的标记。这一步就是回溯——把之前的选择完全撤销,回到选这个元素之前的状态,这样才能去尝试另一种可能性。

  • 不选当前元素,递归深入
    最后再次调用find(..., index + 1, ...),这次就是不选当前元素,直接去处理下一个元素,看看不选这个元素的情况下,能不能凑出目标和。

举个简单例子理解

比如数组是[2,3,5],目标和是5:

  1. 第一次到index=0(元素2),先选它,currSum变成2,去处理index=1;
  2. 在index=1选3,currSum变成5,刚好等于目标和,就输出选中的2和3;
  3. 递归返回后,回溯:currSum减3变回2,solution[1]改成0,然后尝试不选3的分支,去处理index=2;
  4. index=2选5,currSum变成7≠5,递归到数组末尾返回;
  5. 回溯后不选5,返回;
  6. 回到index=0,回溯:currSum减2变回0,solution[0]改成0,尝试不选2的分支,去处理index=1;
  7. index=1选3,currSum=3,处理index=2;
  8. index=2选5,currSum=8≠5,返回;回溯后不选5,返回;
  9. index=1不选3,处理index=2;选5,currSum=5,刚好等于目标和,输出选中的5。

简单说,这段代码的核心就是穷尽所有「选/不选」的组合,通过递归深入每一种可能,再通过回溯回到上一步尝试另一种可能,直到遍历完所有元素或者找到符合条件的子集。

内容的提问来源于stack exchange,提问作者minihulk22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:01:11