Kのいくつかの値について、 N個のアイテムを含むベクトルVからk個のアイテムを取り出すすべての組み合わせで反復する必要があります。たとえば、N=6およびk=3の場合、アイテムV 1、V 2、およびV [3]でF()を呼び出し、次にアイテムV 1、V 2、およびV [4]で呼び出し、V[4で終わる必要があります。 ]、V[5]およびV[6]。
これで、インデックスのすべての組み合わせを簡単に確認できます。k=3およびN=6と言います。次に、最初の要素は1からN-(k-1)に、2番目の要素は2からN-(k-2)に、k番目はkからN(つまり、N -(kk))。
したがって、k = 3の場合、ループは次のようになります。
for (uint a = 1, a <= N-2, a++)
for (uint b = a + 1, b <= N-1, b++)
for (uint c = b + 1, c <= N, c++)
F(V[a], V[b], V[c])
また、k = 4の場合、反復は次のようになります。
for (uint a = 1, a <= N-3, a++)
for (uint b = a + 1, b <= N-2, b++)
for (uint c = b + 1, c <= N - 1, c++)
for (uint d = c + 1, d <= N, d++)
F(V[a], V[b], V[c], V[d])
ただし、問題は次のとおりです。任意のkをハードコーディングせずに(またはコード生成を使用せずに)、このkレベルのネストをどのように実現しますか?
編集:背景については(別名これは宿題ではありません:))私の数学Stackexchangeの質問に対するハンスエングラーの答えを参照してください: 0-1ナップザックのような-含まれていないすべての手頃なバイナリセレクションのセット
編集:サンプルを提供します。V={1,2,3,4,5}と仮定します。
k = 2の場合、Fを次の順序で呼び出す必要があります:F(1,2)、F(1,3)、F(1,4)、F(1,5)、F(2,3)、 F(2,4)、F(2,5)、F(3,4)、F(3、5)およびF(4,5)。
k = 3の場合、Fを次の順序で呼び出す必要があります:F(1,2,3)、F(1,2,4)、F(1,2,5)、F(2,3,4、 )、F(2,3,5)、F(3,4,5)