子集Sum递归Java

时间:2018-04-15 15:26:58

标签: java recursion sum subset

我很抱歉愚蠢,但是请你用简单的英语向我解释最后的递归线:

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;// select the element
        currSum += A[index];
        find(A, currSum, index + 1, sum, solution);
        currSum -= A[index];    
        solution[index] = 0;// do not select the element
        find(A, currSum, index + 1, sum, solution);
    }
    return;
}

根据我的理解,第一次递归将所有数字加起来为13.它将最后一个索引(在这种情况下为4)标记为0,并将其从总和中减去。

之后,对我来说它很模糊。

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果我们看一下这个例子:A = [1,2,3], sum = 3

  • 第一次递归会发现索引0和1总和为3.所以它们将被打印出来。这个递归将继续进行另一次递归,但是curSum将是3,所以我们将从它返回。 currSum -= A[index]将从currSum减少2(因为A [1] = 2)。原因是你要检查第一个元素(零索引)和第三个元素(可能两个元素,没有第二个元素,可以总计为3)。你也在solution[index] = 0,因为你想忽略打印中的A [1]。最后一件事是第二次&#39;代码中的递归(但不是按执行顺序)find(A, 1, 1 + 1, 3, solution);并继续使用此逻辑。

尝试在一个简单,小巧且相关的示例上进行。就像我的例子一样。把它写在纸上,&#34;输入&#34;你自己去那里的所有递归。每次看到一个返回语句时,就像树一样把它画在树上。

希望它会对你有所帮助(它也会说服你为什么那里有很多工作可以通过动态编程来消除)。