python - Pythonで数値を分割する方法の数

python list recursion data-partitioning

数値nを取り、合計してその数値(パーティション)になる数値のリストのlistを返す再帰関数を定義しました。

def P(n):
    # base case of recursion: zero is the sum of the empty list
    if n == 0:
        yield []
        return

    for p in P(n-1):        
        p.append(1)
        yield p
        p.pop()
        if p and (len(p) < 2 or p[-2] > p[-1]):
            p[-1] += 1
            yield p


関数に番号nのパーティションの数を返す方法を考えていました。

たとえば、P(6)10を返します。
答え
ウィキペディアのPartiton (number theory)ページの「パーティション関数の式」セクションを見ると、パーティション番号を見つける簡単な方法がないことがわかります。

代わりに、あなたの最善の策はおそらく:

sum(1 for _ in P(6))


または、少し単純ですが、大量のメモリを大量に消費します

len(list(P(6)))


既存の関数を使用します。

また、Pによって返された値を保存できるようにする場合は、yieldではなくp[:]を使用する必要があります-同じリストを生成するのではなく、コピーを作成する必要があります(変更したもの) ) 何度も。 pを実行すると、理由がわかります。同じ空のリストのリストが何度も繰り返されます。

パーティショニングの詳細については、Partitioning with Pythonを参照してください。
関連記事

python - pythonはhtmlフォームからファイルを受け取ります

python - PyDevを使用してPythonで変数アクセスにブレークポイントを設定する方法はありますか?

python - ターゲット関数が完了した後にPythonスレッドが確実に終了するようにするにはどうすればよいですか?

python - django / python:複数のテーブルを持つ生のSQL

python - ブレンダーは頂点ごとのUV座標をエクスポートできますか?

python - Pythonのインタラクティブ(注釈付き)チャート[終了]

python - Makoマクロのオプションとして「クラス」を使用する

python - 「pip install」と「setup.py install」での最大再帰[終了]

python - ウェルカムテキストを表示するにはどうすればよいですか?

python - 新しいインタープリターセッションを開始せずに、編集のためにIDLEで.pyファイルを開くにはどうすればよいですか?