运行时出现递归错误。并且不应更改参数
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]);
}
答案 0 :(得分:0)
我认为你的主要问题是当你打电话时
return isSubsetSum(copy, n, sum)
n
和sum
不会递减,因此它们永远不会达到零。你确实在n
和sum
被改变的一端有一个电话,但是从阅读代码可以清楚地知道,对于某些功能输入,你永远不会到达那里。
答案 1 :(得分:0)
您看到的递归错误(至少部分)是因为您的return语句的左侧。
copy
与集合完全相同,因此调用isSubsetSum(copy, n, sum)
与调用isSubsetSum(set, n, sum)
相同。如果你的一个基本情况不适用于set,它也不适用于复制,导致||
评估的左半部分(首先评估)的无限递归。因此,程序永远不会找到问题的解决方案,并且最终你会希望看到递归错误(或者它会永远地继续发挥作用!)
为避免这种情况,您需要在return语句中修改递归调用,以仅处理问题的子集。
答案 2 :(得分:0)
在调试代码之后,我看到你收到这个错误:java.lang.NegativeArraySizeException
,你得到了这个错误,因为当你的数组大小为0时,你试图在方法的第二行复制长度为-1的数据。
更改行的顺序(在开头检查此基本情况),您的方法将正常工作。