2

我需要迭代 n (= 5, fi) 整数的升序序列 x,找到函数 f(*x) 返回 True 的所有序列。

假设如果 f_n(*y) 对于特定的 y 为 False,那么对于 z_i >= y_i 的任何 z,f_n(*z) id 为 False。所以 f_n 的所有参数都是单调的。

这种生成器函数可用于以下方式来确定平方和 < 100 的所有整数的升序序列

for sequence in generate_sequences(5):
   if sum_squares_is_at_least(sequence, 100):
       # some code to trigger the breaking of the generator loop
   else:
       print sequence

澄清:这里的问题是我们需要单独迭代 n 个元素。最初,我们将 [1,1,1,1,1] 迭代到 [1,1,1,1,x],然后我们必须继续将 [1,1,1,2,2] 到 [1, 1,1,2,y],最终以 [a,b,c,d,e] 结尾。似乎生成器应该看起来像这样,但如果需要(由外部确定),需要一些代码来打破 for 和/或 while 循环:

def generate_sequences(length, minimum = 1):
    if length == []:
        yield []

    else: 
        element = minimum
        while True:

            for sequence in generate_sequences(length - 1, element):
                yield element + [sequence]

            element += 1

示例:对于 n = 3,并且平方和不大于 20,将生成以下序列:[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 1, 4], [1, 2, 2], [1, 2, 3], [1, 3, 3], [2, 2, 2], [2, 2, 3]

请注意,在一般情况下,我不能使用 4 是每个元素的上限的信息。这也会严重影响更大示例的运行时间。

4

3 回答 3

1

您在寻找itertools.takewhile吗?

>>> from itertools import takewhile
>>> def gen():  #infinite generator
...    i=0
...    while True:
...       yield range(i,i+5)
...       i = i+1
... 
>>> [ x for x in takewhile( lambda x:sum(x)<20, gen() ) ]
[[0, 1, 2, 3, 4], [1, 2, 3, 4, 5]]
>>> 
于 2013-02-20T14:05:03.530 回答
0
import itertools as it

it.takewhile(lambda x: sum_squares_is_at_least(x, 100), generate_sequences(5))

如果您现在确定5中的5,那么只要它被调用generate_sequences就让它成为数字:yield

def generate_sequences():
    i = 0 # or anything
    while True:
        yield [i, i] # or anything
        i = i + 1 # or anything

然后以这种方式使用它:

it.takewhile(lambda x: sum_squares_is_at_least(x, 100), generate_sequences())
于 2013-02-20T14:02:35.220 回答
0

我会通过从给定列表开始然后附加另一个数字来递归解决它(使用逻辑来防止超过平方和目标)

def makegen(N): #make a generator with max sumSquares: N
    def gen(l=[]): #empty list is valid with sum == 0
        yield l
        if l:
            i = l[-1] #keep it sorted to only include combinations not permutations
        else:
            i = 1 #only first iteration
        sumsquare = sum(x*x for x in l) #find out how much more we can add
        while sumsquare + i*i < N: #increase the appended number until we exceed target
            for x in gen(l+[i]): #recurse with appended list
                yield x
            i += 1
    return gen

以下列方式调用我们的生成器生成器(tee hee :D)允许我们获得我们想要的任何最大平方和

for x in makegen(26)():
    print x
于 2016-10-14T19:54:23.920 回答