Решите уравнения с комбинациями и для циклов - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть уравнения с несколькими неизвестными и диапазоном чисел:

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 голосов
/ 30 апреля 2018

Вы можете использовать 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)).

...