![]() |
1
3
我将向您展示如何思考这个问题以及如何在一般意义上解决这类问题,而不仅仅是提供代码。 首先,让我们重新表述你的问题。事实上,你想要的是对于给定的一组数字,找到满足特定条件的组合。因此,您可以将问题分解为两个不同的步骤。
让我们思考如何递归地解决第一个任务。请记住,如果一个问题可以用递归的方式解决,通常意味着数据中有一些递归模式,通常可以用非常简单明了的方式解决。如果最终得到的是一个混乱的递归解决方案,这几乎意味着你走错了方向。 让我们先看看数据的模式。如果你有一个很小的集合(1,2),那么这个集合中的组合是
让我们在集合中增加一个成员,(1,2,3)。对于这个更大的集合,所有的战斗都是
让我们看看更大的集合(1、2、3、4)。可能的组合有
现在您看到了一些有趣的东西,一个较大集合的组合是较小集合加上附加到每个先前组合的附加元素和附加元素本身的组合。 假设您已经得到了具有一定大小的集合的所有组合的解,则可以从该解导出更大集合的解。这自然形成了一个递归。您可以将这种简单的英语直接翻译为递归代码,如下所示
请注意,我们是如何将解决较大问题的任务分解为解决较小问题的。您需要助手函数,如下所示
现在我们知道了如何从集合中提取所有组合。 然后要过滤它们,您不能将过滤器直接插入到递归步骤中,因为我们依赖之前的解决方案以递归方式构建结果列表。最简单的方法是过滤列表,同时获得所有组合的完整结果。 您将得到这样一个解决方案。
通过在每次递归调用中过滤出总和大于定义值的组合,可以节省一些计算,例如
事实上,递归有不同的方法,这取决于您如何将问题分解为更小的问题。有一些更聪明的方法,但我上面展示的方法是解决这类问题的典型和通用方法。 我有用这种方法解决其他问题的例子 |
![]() |
2
3
下面的代码起作用(删除循环中的“直接返回”,改为条件“返回”)。 但我认为这不是一个好的解决方案。您需要改进算法。 PS:此代码也将只返回一个匹配项,而不是所有匹配项。
测试用例:
|
![]() |
3
2
你能告诉我你在哪里发现这个问题的吗?我喜欢解决这类问题,Bdw以下是我的方法:
输出:
|
|
Justin Haddock · 动态规划Python路径算法 7 年前 |
|
Pal Jereh · 形成字符串的最小路径 7 年前 |
|
Reddy90 · 计算二进制表示形式正好需要数字1的数字 7 年前 |
![]() |
daniel · java—如何避免将全局外部变量作为递归函数的输出 7 年前 |
![]() |
ng.newbie · TopCoder中的示例违反了约束 7 年前 |
![]() |
Mohamed Benkedadra · 数组中每个元素的递归 7 年前 |