子集和递归Java
对不起,我很傻,但你能用简单的英语向我解释一下最后的递归行吗子集和递归Java,java,recursion,sum,subset,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++) {
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;
}
公共静态void find(int[]A,int currSum,int index,int sum,
int[]解决方案){
如果(currSum==总和){
System.out.println(“\nSum-found”);
for(int i=0;i
据我所知,第一个递归将所有的数字相加到13。在它将最后一个索引(本例中为4)标记为0并从总和中减去之后
在那之后,对我来说雾很大
提前谢谢 如果我们看这个例子:
A=[1,2,3],sum=3
:
- 第一个递归将发现索引0和1的总和为3。因此,它们将被打印出来。这个递归将继续到另一个递归,但是curSum将是3,所以我们将从它返回
将从currSum减少2(因为A[1]=2)。原因是您希望检查第一个元素(索引为零)和第三个元素(如果没有第二个元素,它们的总和可能都是3)。您也在执行currSum-=A[index]
,因为您希望忽略打印中的[1]。最后一件事是代码中的“第二”递归(但不是按执行顺序)解决方案[index]=0
find(A,1,1+1,3,解决方案)代码>并继续此逻辑
希望它能对您有所帮助(它也能说服您,为什么有这么多的工作可以通过使用动态规划来消除)。欢迎使用so。请发布代码,不要链接到代码。看:我很抱歉,我只是急于想找到答案。再次为错误理解感到抱歉。问题中缺少一些信息:“将所有数字加起来等于13”-你在哪里看到13?“它标记了最后一个索引(本例中为4)”-再次说明,4基于什么?非常感谢您将其写下来!我会按照你告诉我的去做。祝你过得愉快@minihulk22太棒了!请随时提出更多问题。