k 個の部分で n のすべてのパーティションを列挙しようとしています。
したがって、p(5,3) の場合、k = 3 => (3,1,1)、(2,2,1) の 2 つのパーティションが得られます。
stackoverflow を検索して調べた結果、次のことがわかりました。
def p(n,k):
lst = []
if n < k:
return lst
elif k == 1:
return lst
elif k == n:
return lst
else:
p(n-1, k-1)
p(n-k, k)
return lst
^^^^これは私が望む形です。
そのままで、k 個の部分の合計を見つけるのは簡単です。p(n-1, k-1) + p(nk,k) を返します。私の場合、[(3,1,1), (2,2,1)] のように各要素をリストする必要があります。
私の主な問題は、これらのパーティションを再帰的に「構築」することです。これにどのように取り組みますか?
編集
基本ケース k = 1 を取得する場合は、+ 1、k-1 回を追加します。(4,1) 次に (4,1,1)
基本ケース k = n の場合は、分割して各部分に 1 つを削除します。
そのように:(3,3)次に(3,3,3)そして(2,2,2)
基本ケース k < n の場合、何もありません
基本的に、私の問題は、ベースケースからトップまでのものを「積み重ね」、完全なリストを取得することです p(6,3) = [(2,2,2), (4,1,1), (3,2 、1)]