【2014年の面接準備】再帰的な応用-配列組合せの実現
5575 ワード
1.重複配列の問題がある
例題:3,2,1の3つの数字で1つの4桁を構成して、数字は繰り返すことができます.
ここでは明らかに3の4次方種の可能性があり,再帰的に以下のように実現できる.
2.全サブセットを生成する組合せ問題
例題は{a 1,a 2,...,an}配列があり,その配列のすべての組合せを出力してみる.
ここでは、各数にサブセットを入れる場合と入れない場合の2つが得られる.
従って2のn次方種子セット(空セットを含む)が共にあり、空セットを含まなければ2のn次方減がある場合
Sample Input
4
1 2 3 4
Sample Output
1
12
123
1234
124
13
134
14
2
23
234
24
3
34
4
3.指定された個数の組合せ問題を生成する
例えば{1,2,3,4,5}の3つを選択し,上記のコードを少し修正すれば実現できる.
4.全配列問題
例題:3,2,1の3つの数字で1つの4桁を構成して、数字は繰り返すことができます.
ここでは明らかに3の4次方種の可能性があり,再帰的に以下のように実現できる.
void quanpailie1(int a[],int i,int n)
{
//i = n
if(i == n)
{
for(int i = 0;i < n; i++)
{
cout << a[i] ;
}
count++;
cout<<endl;
}
else
{
//
a[i] = 1;
quanpailie1(a, i + 1, n);
a[i] = 2;
quanpailie1(a, i + 1, n);
a[i] = 3;
quanpailie1(a, i + 1, n);
}
}
int main()
{
int a[4];
quanpailie1(a, 0, 4);
cout<< " " << pailie_num << " !" <<endl;
system("PAUSE");
return 0;
}
2.全サブセットを生成する組合せ問題
例題は{a 1,a 2,...,an}配列があり,その配列のすべての組合せを出力してみる.
ここでは、各数にサブセットを入れる場合と入れない場合の2つが得られる.
従って2のn次方種子セット(空セットを含む)が共にあり、空セットを含まなければ2のn次方減がある場合
Sample Input
4
1 2 3 4
Sample Output
1
12
123
1234
124
13
134
14
2
23
234
24
3
34
4
// a[] ,
//a[i] = 0 a2[i] ,a[i] = 1 a2[i]
void quanzuhe(int a[],int i,int n,int a2[])
{
if(i == n)
{
int num = 0;
for(int i = 0;i < n; i++)
{
if(a[i] == 1)
{
cout << a2[i];
num++;
}
}
if(num != 0) cout<<endl;
}
else
{
a[i] = 1;
quanzuhe(a, i + 1, n, a2);
a[i] = 0;
quanzuhe(a, i + 1, n, a2);
}
}
int main()
{
int a[3];
int a2[3] = {1,2,3};
quanzuhe(a, 0, 3, a2);
system("PAUSE");
return 0;
}
3.指定された個数の組合せ問題を生成する
例えば{1,2,3,4,5}の3つを選択し,上記のコードを少し修正すれば実現できる.
// m
void zuhe(int a[],int i,int n,int a2[], int m)
{
if(i == n)
{
int num = 0;
for(int i = 0; i < n; i++)
{
if(a[i] == 1)
{
num++;
}
}
if(num == m)
{
for(int i = 0; i < n; i++)
{
if(a[i] == 1)
{
cout<<a2[i];
}
}
cout<<endl;
}
}
else
{
a[i] = 1;
zuhe(a, i + 1, n, a2, m);
a[i] = 0;
zuhe(a, i + 1, n, a2, m);
}
}
int main()
{
int a[5];
int a2[5] = {1,2,3,4,5};
zuhe(a, 0, 5, a2, 3);
system("PAUSE");
return 0;
}
4.全配列問題
static int g_sCnt = 0;
//permutation .
void permutation(char* pStr, char* pBegin)
{
if(*pBegin == '\0')
{
++g_sCnt;
cout << pStr << endl;
}
else
{
for(char* pCh = pBegin; *pCh != '\0'; ++pCh)
{
// .
char temp = *pCh;
*pCh = *pBegin;
*pBegin = temp;
permutation(pStr,pBegin+1);
// , .
temp = *pCh;
*pCh = *pBegin;
*pBegin = temp;
}//end for
}//end else
}
//
void permutation(char* pStr)
{
if(pStr== NULL)
{
return;
}
else
{
permutation(pStr,pStr);
}
}
int main()
{
char strSrc[] = "abc";
permutation(strSrc);
cout<< " " << g_sCnt << " !" <<endl;
system("PAUSE");
return 0;
}