特定の文字または数字のセットの組み合わせを生成する問題に対する非再帰的なアプローチが必要でした。
したがって、数 n の部分集合 k が与えられた場合、考えられるすべての組み合わせ n!/k!(nk)! を生成します。
再帰的な方法は、前の 1 つの組み合わせが与えられると、組み合わせを提供します。
非再帰的な方法は、ループ インデックスiの指定された値の組み合わせを生成します。
私はこのコードで問題に取り組みました:
n = 4 および k = 3 でテストして動作しますが、k を 3 より大きい数値に変更すると動作しません。
それは(nk)という事実によるものですか?n = 4 の場合、k = 3 は 1 です。k > 3 の場合は 1 より大きくなりますか?
ありがとう。
int facto(int x);
int len,fact,rem=0,pos=0;
int str[7];
int avail[7];
str[0] = 1;
str[1] = 2;
str[2] = 3;
str[3] = 4;
str[4] = 5;
str[5] = 6;
str[6] = 7;
int tot=facto(n) / facto(n-k) / facto(k);
for (int i=0;i<tot;i++)
{
avail[0]=1;
avail[1]=2;
avail[2]=3;
avail[3]=4;
avail[4]=5;
avail[5]=6;
avail[6]=7;
rem = facto(i+1)-1;
cout<<rem+1<<". ";
for(int j=len;j>0;j--)
{
int div = facto(j);
pos = rem / div;
rem = rem % div;
cout<<avail[pos]<<" ";
avail[pos]=avail[j];
}
cout<<endl;
}
int facto(int x)
{
int fact=1;
while(x>0) fact*=x--;
return fact;
}