如何生成allowed_ints
总和为goal
的组合列表?
示例:
allowed_ints=[1,2], goal=4
combinations = [[1,1,1,1],[1,1,2],[2,1,1],[2,2],[1,2,1]]
allowed_ints=[5, 6], goal=13
combinations = []
到目前为止,我所做的并不奏效。
def combinations(allowed_ints, goal):
if goal > 0:
for i in allowed_ints:
for p in combinations(allowed_ints, goal-i):
yield [i] + p
else:
yield []
print list(combinations([1, 2],3))
[[1, 1, 1], [1, 1, 2], [1, 2], [2, 1], [2, 2]] # not what I want
答案 0 :(得分:1)
使用你的功能试试这个:
def combinations(allowed_ints, goal):
if goal > 0:
for i in allowed_ints:
for p in combinations(allowed_ints, goal-i):
if sum([i] + p) == goal:
yield [i] + p
else:
yield []
print list(combinations([1, 2],3))
输出:
[[1, 1, 1], [1, 2], [2, 1]]
答案 1 :(得分:0)
我知道你已经选择了一个答案,但我想提供一个与你的代码不太相似的替代品。如果你想使用递归,我会建议像这样:
def combinations(allowed_ints, list, goal):
# base case: you're done
if sum(list) == goal:
print list
# if overshoot, stop here
elif sum(list) > goal:
pass
else:
for i in allowed_ints:
new_list = list[:]
new_list.append(i)
combinations(allowed_ints, new_list, goal)
combinations([1, 2],[],4)
这并不比建议的答案好,但采用了不同的方法。
答案 2 :(得分:-1)
您应该包含3个条件,例如
目标== 0然后递归工作
目标< 0然后递归失败
目标> = 0并且列表元素结束然后递归失败
顺便说一句,你可以使用递归来完成所有操作。不需要循环,递归也可以做循环