![](/img/trans.png)
[英]Finding the path from the root node to a specified node in a tree using recursion
[英]Return Path at the root node when using recursion
我正在尝试为子集和问题创建一个递归函数。 我创建了一个受这个答案启发的功能。
问题:我试图从数组中选择一些元素(例如[50,40,30,20]),其总和被赋予我的定义为sum
(例如100)。
我已经根据答案中的建议创建了稍微修改过的函数。
从前面拾起并选择它或不选择它。
如果我选择一个元素,缩小列表中的总和将小于所选元素,否则如果我不选择该元素,缩小列表中的总和将是原始元素。
但是,我发现最困难的事情是返回跟踪到递归调用的根节点的路径。 当我到达匹配总和的节点时,我能够打印路径。
这是我的功能:
private static boolean findSumFromSubList(ArrayList<Integer> set, Integer sum, ArrayList<Integer> result) {
if (sum < 0)
return false;
if (sum == 0) {
// Got it! Awesome! Print it!
System.out.println(result);
return true;
}
if (set.size() == 0 && sum != 0)
return false;
ArrayList<Integer> newSet = new ArrayList<>(set);
newSet.remove(0);
System.out.println("Left: Picking up " + set.get(0));
result.add(set.get(0));
if (findSumFromSubList(newSet, sum - set.get(0), new ArrayList<>(result))) {
return true;
}
System.out.println("Right: NOT Picking up " + set.get(0));
result.remove(result.size()-1);
if (findSumFromSubList(newSet, sum, new ArrayList<>(result))) {
return true;
}
return false;
}
我这样称呼它:
ArrayList<Integer> pair = new ArrayList<>();
pair.add(50);
pair.add(40);
pair.add(30);
pair.add(20);
ArrayList<Integer> result = new ArrayList<>();
boolean resultBool = findSumFromSubList(pair, 100, result);
System.out.println("bool: " + resultBool + ", result: " + result);
我得到的输出是:
Left: Picking up 50
Left: Picking up 40
Left: Picking up 30
Right: NOT Picking up 30
Left: Picking up 20
Right: NOT Picking up 20
Right: NOT Picking up 40
Left: Picking up 30
Left: Picking up 20
[50, 30, 20]
bool: true, result: [50]
所以我能够在递归中获得输出,但是如何将该值返回到根调用函数。 因为result
只返回50。
而不是复制result
,尝试传递它,以便它可以在recurses时进行修改。
private static boolean getSum(ArrayList<Integer> set, Integer sum, LinkedList<Integer> result) {
// ...
System.out.println("Left: Picking up " + set.get(0));
result.add(set.get(0));
if (getSum(newSet, sum - set.get(0), result)) {
return true;
}
result.removeLast();
System.out.println("Right: NOT Picking up " + set.get(0));
if (getSum(newSet, sum, result)) {
return true;
}
}
您可以应用类似的逻辑进行set
,但我会将其作为练习留给读者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.