这其实是一个递归
成都创新互联-成都网站建设公司,专注网站设计制作、成都网站制作、网站营销推广,域名注册,雅安服务器托管,绵阳服务器托管有关企业网站制作方案、改版、费用等问题,请联系成都创新互联。
递归函数
意思是这样的
比如有n个数
1
2.。。。n
把1
从第一个开始
往后
与每个数开始交换
然后
第一个数就算定了
后面的
第2个到第n个当成一个整体
再进行这个函数递归
也就是说
第二个到第n个进行全排列
这样下去
当全排列到最后一组数
即第n个数一个的时候
递归退出条件就出来了
就可以输出全排列的值了
当然
最后别忘记把交换的数还原
再进行下一次交换
递归哦
所以最后一局的交换也是很重要的
听完我的解释
再好好琢磨一下
相信你一定会明白的
要是还是不懂可以继续追问我
C语言中没有吧?C++中倒是有一个:
next_permutation(array,array+arrlength)
使用的头文件是#include algorithm
示例:
#include iostream
#include algorithm /// next_permutation, sort
using namespace std;
int main () {
int myints[] = {1,2,3,1};
sort (myints,myints+4);
do {
cout myints[0] ' ' myints[1] ' ' myints[2] ' ' myints[3]'\n';
} while ( next_permutation(myints,myints+4) ); ///获取下一个较大字典序排列
cout "After loop: " myints[0] ' ' myints[1] ' ' myints[2] ' ' myints[3] '\n';
return 0;
}
#include stdio.h
char c,s[10];
int n;
void pern(int k)
{int i;
if(k==n)
printf("%s\n",s+1);
else
for(i=k;i=n;i++)
{c=s[k];s[k]=s[i];s[i]=c;
pern(k+1);
c=s[k];s[k]=s[i];s[i]=c;
}
}
int main()
{ int i;
scanf("%d",n);
for(i=1;i=n;i++)
s[i]='0'+i;
pern(1);
return 0;
}
perm(list,i,j)是一个全排列函数,拿你上面的列子来说:
perm(list,0,5)意思是数组list的前6个数(第0个数到第5个数)的所有排列,它细分的话就等于:第0个数和第1个数互换以后的perm(list,1,5) 第0数和第2数互换perm(list,1,5) ....第0数和第5数互换的perm(list,1,5) 和它本身的所在0位置的perm(list, 1, 5)
如假如6个数是1 2 3 4 5 6
他们的排列就 * * * * * * perm(list,0,5)
1 * * * * * perm(list,1,5)
2 * * * * * perm(list,1,5)
3 * * * * * perm(list,1,5)
4 * * * * * perm(list,1,5)
5 * * * * * perm(list,1,5)
6 * * * * * perm(list,1,5) 就是每一个数都在第0个位置上面都出现一次以后的排列总和。 也就是它的for循环的意思
这只是形象的比喻一下
你这个程序是对的啊。
你每次到4结束之后要返回到上一级调用,然后他们可能会执行下一个循环的。