1

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

我写:

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

这个函数有效,但我得到了反馈,并被告知没有必要调用该函数两次。它做了很多计算。它应该能够轻松计算多达 20 个 powerset。那我该怎么办?如果不调用该函数两次,我将无法使其工作。谢谢。

4

1 回答 1

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”。

于 2015-11-05T22:13:19.507 回答