これが私が思いついたものです:
def onesAndTwos(num):
if num <= 0:
return set()
elif num == 1:
return set([(1, 0)])
elif num == 2:
return set([(2,0), (0, 1)])
else:
setA = set([(1 + x[0], x[1]) for x in onesAndTwos(num-1)])
setB = set([(x[0], 1 + x[1]) for x in onesAndTwos(num-2)])
setA.update(setB);
return setA
print onesAndTwos(10)
print len(onesAndTwos(10))
最初の要素が 1 の数で、2 番目の要素が 2 の数である一連のタプルを使用します。したがって、 で合計 3 を生成できますset[(3,0), (1,1)]
。組み合わせがいくつあるかを調べるには、セット内のタプルを数えます。10 の出力:
set([(8, 1), (6, 2), (0, 5), (4, 3), (10, 0), (2, 4)])
6
これは幾分動的プログラミングのアプローチであり、一連の繰り返し発生するサブ問題と同様の構造が全体にあり、以前のソリューションに基づいて構築することができます。これは、2 つのブランチ (1 を取り除くときの 1 つ目と 2 を取り除くときの 2 つ目) で以前に計算された値を再利用していないため、最適ではありません。