python - 用组合和 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
循环。
解决方案
您可以使用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)
)。
推荐阅读
- javascript - 计算数组中答案的冗余
- tensorflow - 没有优化器的张量流 2.0 负载保存模型
- mysql - 插入新记录后如何创建更新触发器?
- bash - 如何根据模式文本将文件中的文本对齐到看起来像 bash 中的表格?
- python - 可变对象在函数中作为参数传递时不会改变
- java - 如何在 Hibernate 上使用多重联接?
- git - Git如何使用不是我的昵称推送到远程
- wpf - 滚动 ItemsControl 时内存使用增加
- javascript - 如何过滤具有多个键和值的两个数组?
- javascript - 为什么 IF else google app script formula 不会产生正确的值?