学习了递归之后,第一个练习就是用递归解决“斐波拉契数列”。第二个就是“汉诺(Hanoi)塔”递归解法、第三个就是“全排列”了,总的来说,在全排列上花的时间比较多!起始程序代码如下:
#include <stdio.h>
void permutation(char s[],int b,int e)
{
if((b >= 0)&&(b <= e))
{
if(b == e)
{
printf("%s\n",s);
}
else
{
int i = 0;
for(i = b;i <= e;i++)
{
int flag = s[b];
s[b] = s[i];
s[i] = flag;
permutation(s,b+1,e);
flag = s[b];
s[b] = s[i];
s[i] = flag;
}
}
}
}
int main(void)
{
char s[] = "aabb";
permutation(s,0,3);
return 0;
}
感觉蛮好!但是此程序只能对无重复字符的字符串进行全排列,对于有重复字符的字符串,此程序就不准确了!
以上程序输出如下:
那么怎么解决呢?》
想了很久,试了好多方法!最后的结果是------在递归调用之前判断一下就OK!所以,
在递归之前加上:
if(s[b] != s[i] || i == b)
也就是说,在s[b]和s[i]不相同的情况下,或者i==b的情况下,才会进行递归调用!
程序如下:
#include <stdio.h>
void permutation(char s[],int b,int e)
{
if((b >= 0)&&(b <= e))
{
if(b == e)
{
printf("%s\n",s);
}
else
{
int i = 0;
for(i = b;i <= e;i++)
{
int flag = s[b];
s[b] = s[i];
s[i] = flag;
if(s[b] != s[i] || i == b)
permutation(s,b+1,e);
flag = s[b];
s[b] = s[i];
s[i] = flag;
}
}
}
}
int main(void)
{
char s[] = "aabb";
permutation(s,0,2);
return 0;
}
输出如下: