1

私はPython3が初めてで、再帰的なpowerset関数を実行しようとしています. リスト内包表記を使用する必要があります。

私が書いた:

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

この関数は機能しますが、フィードバックを受け取り、関数を 2 回呼び出す必要はないと言われました。それは多くの計算をしました。最大 20 のべき乗セットを簡単に計算できるはずです。では、どうすればいいですか?関数を 2 回呼び出さないと動作しません。ありがとう。

4

1 に答える 1

0

1 回計算powerset(seq[1:])して変数に格納し、2 回使用するだけです。

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

あなたのものとの違いは、この方法では2 回使用しますが、 計算は 1 回だけであるということです。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 に答える