【问题标题】:Recursive function that returns combinations of size n chosen from list返回从列表中选择的大小 n 组合的递归函数
【发布时间】:2019-04-27 03:37:39
【问题描述】:

我正在尝试编写一个递归函数,该函数将整数 n 和列表 l 作为其输入,并返回可以从 @987654325 中的元素中选择的所有大小 n 组合的列表@。我知道我可以只使用 itertools,但我想在编写递归函数方面做得更好,我相信编写自己的函数会对我有所帮助。

例如,如果你输入:

n = 3

l = [1, 2, 3, 4]

我希望输出是:

`[ [1, 2, 3], [1, 3, 4], [2, 3, 4], [1, 2, 4] ]

到目前为止,我已经编写了以下代码:

def get_combinations(l, n): # returns the possible combinations of size n from a list of chars

    if len(l) == 0:
        return []

    elif n == 1:
        return [l[0]]

    newList = list()

    for i in range(len(l)):
    
        sliced_list = l[i:]
        m = n - 1

        #lost here, believe I need to make a recursive call somewhere with get_combinations(sliced_list, m)

    return newList

我发现 this example of such a function for permutations 很有帮助,但我正在努力实现类似的东西。

为了澄清,我以我所做的方式设置了我的基本案例,因为我希望在我的递归调用中通过 sliced_listm,如果你想象 i = 3 时的情况,你会sliced_list 有一个空列表,当您深入到足以建立组合时,m 将为 1。但我并没有与这些基本案例结婚。

让我试着总结一下我的问题:

  1. 我如何生成一个完全是列表列表的最终结果,而不是列表列表列表的列表...(深度 = n)?

  2. 我的递归调用应该是什么样的?

  3. 我是否以完全错误的方式解决这个问题?

【问题讨论】:

  • 1、2、4呢?
  • 一种方法:查看列表的第一项。首先处理它是组合的一部分的情况 -> 从列表中删除它,减少 n 并递归调用并将项目添加到返回的列表项(也是列表);然后是情况二,它不是组合的一部分-> 从列表中删除它但保留n,递归调用,将返回的列表加入到第一种情况的列表中。当然,需要对递归终止进行适当的检查。
  • @Tacratis 我有数学学位,但不知何故我错过了。已编辑。
  • :) 我只是要求确保我正确理解了您的问题,但此后已经有人回答了。

标签: python recursion combinatorics


【解决方案1】:

首先,我建议您将函数布局为:

def get_combinations(array, n):
    solutions = []

    # all the code goes here

    return solutions

这样,如果出现问题的情况,例如n == 0,您可以忽略它并获得有效(空)结果。下一个问题是这一行是错误的:

elif n == 1:
    return [array[0]]

如果n == 1 正确的做法是返回一个数组,该数组的每个 元素都包裹在list 中:

if n == 1:
    solutions = [[element] for element in array]

这个是你的基本情况,因为递归中的下一层将以此为基础。接下来是问题的核心。如果n > 1 并且数组有内容,那么我们需要遍历数组的索引。对于每一个,我们将在当前索引和n - 1之后的所有内容上递归调用自己:

sub_solutions = get_combinations(array[index + 1:], n - 1)

这会返回部分解决方案。我们需要将元素 at 填充到当前索引处,即。 array[index],添加到sub_solutions 中每个sub_solution 的前面,并将每个增强的sub_solution 添加到我们在函数末尾返回的solutions 列表中:

solutions.append([array[index]] + sub_solution)

就是这样!

【讨论】:

  • 谢谢,这非常有效,我真的很感激。今天早上我实际上已经非常接近解决方案,但它仍然不太正确,然后你关于让基本案例返回每个元素而不是第一个元素的评论澄清了一切。
  • 并且完整/更新的代码看起来像什么,例如? :-)
猜你喜欢
  • 1970-01-01
  • 2018-03-01
  • 2016-06-28
  • 2021-04-06
  • 2013-09-13
  • 2021-08-07
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多