每次递归调用,解决一个当前元素数量为n-k ( k = 0...n-1)的全排列,为解决当前当前排列, 又需要递归解决n-k个元素数量为n-k-1的全排列
举例:字符串abc, n = 3, []中的元素为需要计算排列的元素集,[]外的元素为已经确定排列顺序的元素
[abc]
/ | \
a[bc] b[ac] c[ba]
/ | / \ | \
ab[c] ac[b] ba[c] bc[a] cb[a] ca[b]
| | | | | |
abc acb bac bca cba cab
第一层:k = 0,1个全排列需解决,为此需解决3个元素数为2的全排列
第二层:k = 1,3个全排列需解决,解决每个全排列需要解决2个元素数为1的全排列
第三层:k = 2,6个全排列需解决,解决每个全排列需要解决2个元素数为0的全排列(说明当前层已解得所需的所有全排列)
第四层:k = 3, k等于n,到达递归底层,打印当前排列
static void RecursivePermute(char* str,int k)//递归函数
举例:字符串abc, n = 3, []中的元素为需要计算排列的元素集,[]外的元素为已经确定排列顺序的元素
[abc]
/ | \
a[bc] b[ac] c[ba]
/ | / \ | \
ab[c] ac[b] ba[c] bc[a] cb[a] ca[b]
| | | | | |
abc acb bac bca cba cab
第一层:k = 0,1个全排列需解决,为此需解决3个元素数为2的全排列
第二层:k = 1,3个全排列需解决,解决每个全排列需要解决2个元素数为1的全排列
第三层:k = 2,6个全排列需解决,解决每个全排列需要解决2个元素数为0的全排列(说明当前层已解得所需的所有全排列)
第四层:k = 3, k等于n,到达递归底层,打印当前排列
static void RecursivePermute(char* str,int k)//递归函数
{
int i;
if(k==strlen(str))
printf("%s\n",str);
else
{
for(i=k;i<strlen(str);i++)
{
ExchangeCharacters(str,k,i);
RecursivePermute(str,k+1);
ExchangeCharacters(str,k,i);
}
}
}
static void ExchangeCharacters(char* str, int p1,int p2)
{
char tmp;
tmp=str[p1];
str[p1]=str[p2];
str[p2]=tmp;
}
没有评论:
发表评论