我很抱歉愚蠢,但是请你用简单的英语向我解释最后的递归线:
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,并将其从总和中减去。
之后,对我来说它很模糊。
提前致谢!
答案 0 :(得分:0)
如果我们看一下这个例子:A = [1,2,3], sum = 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;你自己去那里的所有递归。每次看到一个返回语句时,就像树一样把它画在树上。
希望它会对你有所帮助(它也会说服你为什么那里有很多工作可以通过动态编程来消除)。