递归查找子集sum java时出错

时间:2014-03-06 23:21:48

标签: java recursion

运行时出现递归错误。并且不应更改参数

n是包含所需总和(目标)的子集的大小: 所以

set[] = {5,6,9,-1,4,2}
n = 3
sum = 10

等于true,因为大小为3的子集总和为10是{9,-1,2}

public static boolean isSubsetSum(int[] set, int n, int sum) {
int[] copy = new int[set.length - 1];
System.arraycopy(set, 0, copy, 0, set.length - 1);

// Base Cases
  if (sum == 0 && n == 0)
    return true;
  if (set.length == 0)       // fixed base case. 
    return false;

  if (set[set.length - 1] > sum) {
    return isSubsetSum(copy, n, sum);
  }

  return isSubsetSum(copy, n, sum) || isSubsetSum(copy, n-1, sum - set[set.length-1]);
}

3 个答案:

答案 0 :(得分:0)

我认为你的主要问题是当你打电话时

return isSubsetSum(copy, n, sum)

nsum不会递减,因此它们永远不会达到零。你确实在nsum被改变的一端有一个电话,但是从阅读代码可以清楚地知道,对于某些功能输入,你永远不会到达那里。

答案 1 :(得分:0)

您看到的递归错误(至少部分)是因为您的return语句的左侧。

copy与集合完全相同,因此调用isSubsetSum(copy, n, sum)与调用isSubsetSum(set, n, sum)相同。如果你的一个基本情况不适用于set,它也不适用于复制,导致||评估的左半部分(首先评估)的无限递归。因此,程序永远不会找到问题的解决方案,并且最终你会希望看到递归错误(或者它会永远地继续发挥作用!)

为避免这种情况,您需要在return语句中修改递归调用,以仅处理问题的子集。

答案 2 :(得分:0)

在调试代码之后,我看到你收到这个错误:java.lang.NegativeArraySizeException,你得到了这个错误,因为当你的数组大小为0时,你试图在方法的第二行复制长度为-1的数据。
更改行的顺序(在开头检查此基本情况),您的方法将正常工作。