Вложено для циклов, где внутренние циклы зависят от внешних - PullRequest
0 голосов
/ 14 мая 2019

Рассмотрим следующую проблему:

Суммируйте некоторую функцию f: Z ^ 2 -> R по всем натуральным числам (x, y), где x, y находятся в [0, B]

Это довольно легко реализовать в Python:

res = 0
for x in range(B+1):
    for y in range(B+1):
        res += f(x,y)

Конечно, есть много «лучших» способов написать вышеприведенное утверждение.Я сосредоточусь на конкретном методе - используя itertools, вы можете написать:

res = 0
for vals in itertools.product(range(B+1), repeat = 2)
    res += f(*vals)

Это дает то преимущество, что обобщение его на функции f: Z ^ n -> R тривиально, простоизменить repeat = 2 на repeat = n.Если переменные имеют разные диапазоны, вы меняете код на itertools.product(*[B1, B2, ..., Bn]), опять же, довольно просто.


Я заинтересован в выполнении вышеизложенного, но где переменные, которые я суммирую, "зависимы"" в некотором роде.Достаточно рассмотреть случай, когда я суммирую по переменным (x, y) в [0, B] ^ 2, где x + y <= B. </p>

Вы можете снова написать это как вложенное дляцикл:

res = 0
for x in range(B):
    for y in range(B - x):
        res += f(x, y)

Мне интересно, есть ли какие-нибудь стандартные библиотечные методы, чтобы обобщить это (точно так же, как itertools.product обобщил последнюю конструкцию).Вы могли бы снова использовать конструкцию iterator.product (и просто pass, когда (x1, x2, ..., xn) не соответствуют критерию), но мне было интересно, существует ли более прямой способ итерации поэтот набор с использованием стандартной библиотеки.

Причина, по которой подход pass является неподходящим, заключается в количестве баллов, которые вам придется пройти.Некоторые математические вычисления (соотнося объем шара l1 с объемом шара l бесконечности как функцию от размера) показывают, что только 1 / n!Точки будут соответствовать критериям приемлемости, поэтому при переборе [0, B] ^ n и проверке выполнения некоторых критериев будет довольно большой «мусор».

...