Powerset递归,列表理解python3

时间:2015-11-05 21:59:50

标签: python python-3.x recursion powerset

我是Python3的新手,正在尝试做一个递归的powerset函数。它应该使用列表理解。

我写道:

def powerset(seq):
    if not seq:
       return [[]]
    return powerset(seq[1:]) + [[seq[0]] + n for n in powerset(seq[1:])]

此功能有效,但我收到反馈,并被告知无需再调用该功能两次。它做了很多计算。它应该可以轻松计算多达20个powersets。那我该怎么办?我无法在不调用该函数两次的情况下使其工作。感谢。

1 个答案:

答案 0 :(得分:0)

只需计算一次powerset(seq[1:]),将其存储在变量中,并使用两次:

def powerset(seq):
    if not seq:
        return [[]]
    ps = powerset(seq[1:])
    return ps + [[seq[0]] + n for n in ps]

与您的不同之处在于,您使用 ps两次,但计算只是一次。

或者,你可以使用双重列表理解(如果你喜欢那种东西......)

def powerset(seq):
    return [x for ps in powerset(seq[1:]) for x in ([seq[0]] + ps, ps)] if seq else [[]]

这里,在列表推导中 中定义了相同的临时变量ps。但请注意,结果将以这种方式略有不同。

  

我觉得很不清楚。我实际上不明白如何将它分配给变量可以改变它?这意味着同样的事情?

你似乎在纯粹的数学方面想得太多了。在编程中,y = f(x)并不意味着“y与f(x)的/同义词相同”,而是“将f(x)的结果分配给y”。