関数 f(*x) が True を返すすべてのシーケンスを見つけて、n (= 5, fi) 整数の昇順シーケンス x を反復処理する必要があります。
特定の y に対して f_n(*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 が各要素の上限であるという情報を使用できないことに注意してください。これは、大規模な例の実行時間にも深刻な影響を与えます。