我有多个未知数的方程式和数字范围:
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
循环。
答案 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)
)。