我有下面的算法,其目的是找到一系列数字的所有可能的排列,因为它们可以切换符号。当它到达树中的叶节点时,它将调用另一个迭代列表的方法,以查看该排列的总和是否等于系列中的数字。我也在摆弄一个算法,看看一个系列的子集是否小于一个给定的数字。例如60,35和40,数字60 + 40 <40。 110.我的问题是,一旦发现树中的一个分支是我需要的,其他分支仍然会被探索。我怎么能打断这个?现在我所拥有的只是system.exit(1);
public static int PlusMinus(Node start, Node node, int Sum){
Node head = start;
boolean Success = false;
if(node != null){
PlusMinus(head, node.next, node.item+Sum);
PlusMinus(head, node.next, node.item*(-1)+Sum);
return Sum;
}
else{
Success = getSum(Sum,start);
if(Success == true){
System.out.println("Yes");
System.exit(1);
return 1;
}
}
return 0;
}
看看上面的内容,我的初衷是让它将叶节点总和返回给调用程序。正如我通过程序逐步理解的那样,如果最右边的分支是正确的排列,它就不会以该叶节点返回值结束。它仍将跳回到父级,然后继续测试下一个分支。
答案 0 :(得分:1)
您的返回值应该是布尔值,表示您是否找到了要查找的总和。由于您没有使用方法返回的当前值,因此您似乎不需要它。
public static boolean PlusMinus(Node start, Node node, int Sum){
Node head = start;
if(node != null) {
// you should return true if either of the recursive calls returned true
if (PlusMinus(head, node.next, node.item+Sum))
return true;
return PlusMinus(head, node.next, node.item*(-1)+Sum);
} else {
return getSum(Sum,start);
}
}
编辑:
我不知道你的getSum
方法做了什么,但看起来你不需要它。您应该转到下一个递归调用Sum-node.item
或Sum+node.item
,具体取决于当前节点应该与总和相关的符号,并在到达叶节点时检查是否达到0。
public static boolean PlusMinus(Node start, Node node, int Sum){
if(node != null) {
// you should return true if either of the recursive calls returned true
if (PlusMinus(head, node.next, Sum - node.item))
return true;
return PlusMinus(head, node.next, Sum + node.item);
} else {
return Sum == 0;
}
}