用组合和循环求解方程

时间:2018-04-30 07:38:31

标签: python for-loop combinations

我有多个未知数的方程式和数字范围:

eq1 = (x + 5 + y) #
ans = 15
no_range = [1..5]

我知道我可以通过检查所有可能的组合来解决方程式:

solved = False
for i in range(1, 5+1)  # for x
    for j in range(1, 5+1)  # for y
        if i + 5 + j == ans:
            solved = True

所以,问题是我想要一个函数来处理unknown_count未知量。因此,以下方程或任何方程都可以用上述相同的方式解决:

eq1 = (x + 5 + y) 
ans = 15

eq2 = (x + 5 + y + z * a + 5 * b / c) 
ans = 20

我只是想不出办法,因为对于每个未知的你需要一个for循环。

1 个答案:

答案 0 :(得分:1)

您可以使用itertools.product生成笛卡尔积 任意数量的变量:

In [4]: import itertools
In [5]: list(itertools.product(range(1, 5+1), repeat=2))
Out[5]: 
[(1, 1),
 (1, 2),
 (1, 3),
 ...
 (5, 3),
 (5, 4),
 (5, 5)]

所以你可以修改你的代码:

import itertools as IT
unknown_count = 6
ans = 20
solved = False
def func(*args):
    x, y, z, a, b, c = args
    return x + 5 + y + z * a + 5 * b / c
for args in IT.product(range(1, 5+1), repeat=unknown_count):
    if func(*args) == ans:
        solved = True
        print('{} + 5 + {} + {} * {} + 5 * {} / {} = {}'.format(*(args+(ans,))))

产生了很多解决方案,例如

1 + 5 + 1 + 1 * 3 + 5 * 2 / 1 = 20
1 + 5 + 1 + 1 * 3 + 5 * 4 / 2 = 20
1 + 5 + 1 + 2 * 4 + 5 * 1 / 1 = 20
...
5 + 5 + 5 + 2 * 2 + 5 * 1 / 5 = 20
5 + 5 + 5 + 3 * 1 + 5 * 2 / 5 = 20
5 + 5 + 5 + 4 * 1 + 5 * 1 / 5 = 20

使用* unpacking operator 创建一个函数func,它接受​​任意数量的参数(即def func(*args)),也是 将任意数量的参数传递给func(即func(*args))。