Есть ли эффективный способ перебора? - PullRequest
0 голосов
/ 16 октября 2018

Я использую python для создания прототипа следующего выражения:

    (n1^i1)*(n2^i2)*......*(n10^i10) = output/input_min (where I have to store i1,i2,i3,..)

Я написал нечто подобное только для 3 элементов.

        passes = []
        max_pass = 8
        for i in range(0,max_pass):
            for j in range(0,max_pass):
                for k in range(0,max_pass):
                    temp = np.array([i, j, k])
                    comp = np.round(np.prod(basis**temp), 3)
                    ratio = np.round(self.output/self.input_min, 3)
                    if comp == ratio:
                        passes.append([i, j, k])

Учитывая, что я знаю n1, n2, ..., n10 и отношение правой руки. Есть ли способ, которым я могу сделать это без записи 10 вложенных циклов?(i1, i2, ... i10 должны быть целыми числами)

1 Ответ

0 голосов
/ 16 октября 2018

Используйте массив счетчиков, все они инициализированы нулем.

Формируйте бесконечный цикл, в котором вы увеличиваете первый счетчик.Когда счетчик достигнет максимального значения, сбросьте его на ноль и перенесите на следующий счетчик.Следующий счетчик следует той же логике и т. Д.

Таким образом, внешний цикл будет включать внутренний цикл распространения переноса.

Обработка прекращается, когда переносится последний счетчик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...