首页 > 解决方案 > 用组合和 for 循环求解方程

问题描述

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

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循环。

标签: pythonfor-loopcombinations

解决方案


您可以使用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

*包运算符用于创建一个函数 ,func它接受任意数量的参数(即def func(*args)),也可以将任意数量的参数传递给func(即func(*args))。


推荐阅读