【问题标题】:How can I get a recursive algorithm to return a value before it finishes running?如何让递归算法在它完成运行之前返回一个值?
【发布时间】:2016-04-03 05:58:08
【问题描述】:

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

看了上面,我的初衷是让它把叶子节点和返回给调用程序。不过,正如我从逐步执行程序中了解到的那样,如果最右边的分支是正确的排列,它不会只是在那个叶节点返回值处结束。它仍然会跳回父级,然后继续测试下一个分支。

【问题讨论】:

  • 返回sum并调用这两个方法有什么意义?
  • 永远不要将System.exit() 用于控制流。这是一个非常糟糕的设计。用户期望该方法将返回一个值,但并不期望它会停止整个 JVM。

标签: java algorithm


【解决方案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;
    }
}

【讨论】:

  • 末尾的return false 是多余的。
  • @Psoniax 我在代码中做了一个修复,现在它是多余的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
  • 2017-06-07
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
相关资源
最近更新 更多