我是Python3的新手,正在尝试做一个递归的powerset函数。它应该使用列表理解。
我写道:
def powerset(seq):
if not seq:
return [[]]
return powerset(seq[1:]) + [[seq[0]] + n for n in powerset(seq[1:])]
此功能有效,但我收到反馈,并被告知无需再调用该功能两次。它做了很多计算。它应该可以轻松计算多达20个powersets。那我该怎么办?我无法在不调用该函数两次的情况下使其工作。感谢。
答案 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”。