现已解决:限制排列Python解决方案

问题描述 投票:0回答:1

解决方案是由评论者提出的:保存帖子,以防它对其他人有帮助。

我目前正在尝试编写一个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)))
python recursion combinatorics
1个回答
0
投票

解决此问题的一种方法是更改循环以使用 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)
© www.soinside.com 2019 - 2024. All rights reserved.