【问题标题】:Subset sum overlapping dilemma recursively递归子集和重叠困境
【发布时间】:2019-01-07 14:32:55
【问题描述】:

我正在研究递归逻辑,其中一个问题是子集和。 AFAI读取,递归运行时有重叠。但是,我不知道是怎么回事。另外,我读到它是为了克服可以使用 DP 的问题,但我想了解 递归如何克服这个问题。你能想象一个重叠的例子吗?

伪代码,

def hasSum( array, start, sum):
   if sum == 0:
       return true

   if start > array.length - 1:
       return false;

   return hasSum(array, start + 1, sum - array[start])
           or hasSum(array, start + 1, sum)

我无法将逻辑与下图联系起来,我肯定忽略了一个点/点。

【问题讨论】:

  • [1, 3, 1, 8] -> 您最终将使用第一个 1 和 3,然后不使用第二个 1,总和为 4。在另一种情况下,您将只使用第二个 1和 3 所以你最终也会以不同的方式得到 4 的总和。只有当另一种情况有解决方案时,其中一种情况才有解决方案,因此重叠
  • 代码中的逻辑与图片不符
  • @dheiberg 貌似,我不是唯一一个难以正确理解递归的学生。感谢您的评论让我感觉好多了。
  • 如果您的数组是 [1,2,3],则图片很好。在每个步骤中,您决定是否将当前元素添加到总和中,在图像中而不是总和中,它显示为总和添加的元素。你最终得到了每一个可能的子集,这意味着对每一个可能的子集求和。当您最终在同一索引处保留相同的总和时,就会产生重叠。
  • @juvian 我不明白 当您最终在同一索引处保留相同的总和时会产生重叠。 案例。你能说得清楚一点吗?

标签: python algorithm recursion recurrence


【解决方案1】:

这里有这条线造成的重叠:

return hasSum(array, start + 1, sum - array[start])
           or hasSum(array, start + 1, sum)

如果算法没有找到第一个 hasSum 的有效条件(由于递归已经遍历整个数组,此时返回到这一点),它将再次尝试第二个 @987654323 @ 忽略当前索引的值。这意味着该算法会多次检查相同的索引。

【讨论】:

  • 感谢您的回答,但解释太肤浅了。不是抓住“复发”的症结所在
  • 您是否想了解算法的实际工作原理?这是一个相当简单的算法,很容易在纸上用 4 个数字组成的小数组和一个简单的总和进行空运行。
  • 简单算法??简单的算法??我已经阅读了三次关键字。只有一行的东西并不意味着简单。 “简单是终极的复杂性。” ——列奥纳多·达·芬奇。祝你好运!
  • “简单”是指代码行数少,分支选项也不多。因此,如果您尝试使用示例 [1, 3, 1] 和 sum 4 在纸上运行它,您将能够自己看到逻辑。或者,使用 IDE 并在代码执行时单步执行代码也是查看每个步骤执行情况的好方法。我可以尝试用文字解释算法,但不幸的是,您热衷于制作一些最容易用笔和纸完成的图表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多