[英]Creating an array of numbers that sum to a given number
我一直在做一些快速而又肮脏的脚本来完成一些化学作业,其中之一遍历了一个常量长度的列表,其中所有元素加在一起便成为一个给定的常量。 对于每一个,我都会检查它们是否满足其他条件,然后将它们附加到另一个列表中。
我想出了一种满足总和标准的方法,但是看起来很可怕 ,而且我敢肯定,这里有一些可教的时刻:
# iterate through all 11-element lists where the elements sum to 8.
for a in range(8+1):
for b in range(8-a+1):
for c in range(8-a-b+1):
for d in range(8-a-b-c+1):
for e in range(8-a-b-c-d+1):
for f in range(8-a-b-c-d-e+1):
for g in range(8-a-b-c-d-e-f+1):
for h in range(8-a-b-c-d-e-f-g+1):
for i in range(8-a-b-c-d-e-f-g-h+1):
for j in range(8-a-b-c-d-e-f-g-h-i+1):
k = 8-(a+b+c+d+e+f+g+h+i+j)
x = [a,b,c,d,e,f,g,h,i,j,k]
# see if x works for what I want
通用递归解决方案:
def get_lists_with_sum(length, my_sum):
if my_sum == 0:
return [[0 for _ in range(length)]]
if not length:
return [[]]
elif length == 1:
return [[my_sum]]
else:
lists = []
for i in range(my_sum+1):
rest = my_sum - i
sublists = get_lists_with_sum(length-1, rest)
for sl in sublists:
sl.insert(0, i)
lists.append(sl)
return lists
print get_lists_with_sum(11, 8)
这是一个递归生成器,它按字典顺序生成列表。 保持exact
为True
将给出请求的结果,其中每个sum == limit; 设定exact
到False
给出了0 <=总和<=限制的所有列表。 递归利用此选项产生中间结果。
def lists_with_sum(length, limit, exact=True):
if length:
for l in lists_with_sum(length-1, limit, False):
gap = limit-sum(l)
for i in range(gap if exact else 0, gap+1):
yield l + [i]
else:
yield []
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.