解决方案是由评论者提出的:保存帖子,以防它对其他人有帮助。
我目前正在尝试编写一个Python脚本来填充一个可用的矩阵,其中包括五个数字加到100的所有可能的排列,这五个数字也只是五的倍数,不包括零,即最终排列是(5, 5,5,5,80) 和 (80,5,5,5,5)。到目前为止,我有一个简单的脚本,可以运行以找到所有整数(即 1,1,1,1,96 作为解决方案),但是,这不包括五的倍数限制,因此该解决方案实际上是无法解决的(代码不会在合理的时间范围内运行)在我的慢速计算机上,有大约 460 万个可用的解决方案。关于如何进行的任何建议都将非常有价值:我是一名尽我所能的合成化学家,而不是程序员,所以请耐心等待:)
脚本:
def sum_k(n, k):
if n == 1:
yield (k,)
else:
for x in range(1, k):
for i in sum_k(n - 1, k - x):
yield (x,) + i
print(list(sum_k(5, 100)))
解决此问题的一种方法是更改循环以使用 3 参数
range
,包括 step
参数,即 range(5, k, 5)
,从 5
开始并以 5 为步长递增。这样,您的代码似乎工作正常,很快就产生了预期的结果。
您也可以将其作为另一个参数(记住也将其传递给递归调用),并将内部嵌套循环更改为
yield from
生成器。
def sum_k(n, k, m=1):
if n == 1:
yield (k,)
else:
yield from ((x,) + i for x in range(m, k, m) for i in sum_k(n-1, k-x, m))
for x in sum_k(5, 100, 5):
print(x)