这是我想出的:
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))
它使用一组元组,其中第一个元素是个数,第二个元素是个数。所以 3 的总和可以产生set[(3,0), (1,1)]
。要找出有多少组合,您可以计算集合中的元组。10的输出:
set([(8, 1), (6, 2), (0, 5), (4, 3), (10, 0), (2, 4)])
6
这在某种程度上是一种动态编程方法,其中我们有一组重复出现的子问题和类似的结构,使我们能够在以前的解决方案的基础上进行构建。这并不是最优的,因为您没有在两个分支中重用先前计算的值(第一个在取走 1 时,第二个在取走 2 时),所以我认为这是一个幼稚的解决方案。