まず、繰り返しを含むパーティションを含むすべてのパーティションを返す再帰アルゴリズムを作成します。
次に、重複要素を含むパーティションを排除するアルゴリズムを作成します。
編集:
既に表示されている番号を再帰的に呼び出すことを避けることで、結果の重複を避けることができます。擬似コード:
Partitions(n, alreadySeen)
1. if n = 0 then return {[]}
2. else then
3. results = {}
4. for i = 1 to n do
5. if i in alreadySeen then continue
6. else then
7. subresults = Partitions(n - i, alreadySeen UNION {i})
8. for subresult in subresults do
9. results = results UNION {[i] APPEND subresult}
10. return results
編集:
同じ結果が複数回生成されるのを回避することもできます。これを行うには、ループの範囲を変更して、単調に増加する方法で新しい要素のみを追加するようにします。
Partitions(n, mustBeGreaterThan)
1. if n = 0 then return {[]}
2. else then
3. results = {}
4. for i = (mustBeGreaterThan + 1) to n do
5. subresults = Partitions(n - i, i)
6. for subresult in subresults do
7. results = results UNION {[i] APPEND subresult}
8. return results