我需要迭代 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 是每个元素的上限的信息。这也会严重影响更大示例的运行时间。