请考虑以下问题:
对所有正整数(x,y)上的函数f:Z ^ 2-> R求和,其中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])
,同样非常容易。
我对执行上述操作很感兴趣,但是我要累加的变量在某种程度上是“相关的”。 考虑一下我要对[0,B] ^ 2中的变量(x,y)求和的情况就足够了,其中x + y <= B。
您可以再次将其写为嵌套的for循环:
res = 0
for x in range(B):
for y in range(B - x):
res += f(x, y)
我很感兴趣是否有任何标准的库方法可以将其推广(就像itertools.product
推广最后一种构造的方式一样)。您可以再次使用iterator.product构造(并且当{x1,x2,...,xn)不符合标准时仅使用pass
,但是我想知道是否有更直接的方法使用标准库对该集合进行迭代。
pass
处理方法不合适的原因是因为您必须跳过点数。一些数学计算(将单位l1球的体积与单位l无穷大球的体积作为尺寸的函数关系)表明只有1 / n!点将符合接受标准,因此在[0,B] ^ n上进行迭代并检查某些条件是否为真时,将会有相当大的“浪费”。