如何在运行完成之前获得递归算法以返回值?

时间:2016-04-03 05:58:08

标签: java algorithm

我有下面的算法,其目的是找到一系列数字的所有可能的排列,因为它们可以切换符号。当它到达树中的叶节点时,它将调用另一个迭代列表的方法,以查看该排列的总和是否等于系列中的数字。我也在摆弄一个算法,看看一个系列的子集是否小于一个给定的数字。例如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;
}

看看上面的内容,我的初衷是让它将叶节点总和返回给调用程序。正如我通过程序逐步理解的那样,如果最右边的分支是正确的排列,它就不会以该叶节点返回值结束。它仍将跳回到父级,然后继续测试下一个分支。

1 个答案:

答案 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.itemSum+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;
    }
}