【问题标题】:error in recursively finding subset sum java递归查找子集总和java时出错
【发布时间】:2014-03-07 07:42:09
【问题描述】:

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

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

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

等于真,因为大小为 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]);
}

【问题讨论】:

    标签: java recursion


    【解决方案1】:

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

    return isSubsetSum(copy, n, sum)
    

    nsum 不会递减,因此它们永远不会达到零。最后你确实有一个调用 nsum 被更改,但从阅读代码很明显,对于某些函数输入,你永远不会到达那里。

    【讨论】:

    • 我在子集 {-4,0,4}、n = 2(或 3)和 sum 需要为 0 时遇到过这种情况...有什么建议吗?
    【解决方案2】:

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

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

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

    【讨论】:

    • 哪个return语句?以及如何建议减少它?
    • 我指的是最后的return语句:return isSubsetSum(copy, n, sum) || isSubsetSum(copy, n-1, sum - set[set.length-1]);.
    【解决方案3】:

    调试代码后,我看到您收到此错误:java.lang.NegativeArraySizeException,您会收到此错误,因为当您的数组大小为 0 时,您尝试在方法的第 2 行以长度 -1 复制它。
    更改行的顺序(在开始时检查此基本情况),您的方法将正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 2020-01-26
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多